2011-07-23 80 views
29

我需要檢測選定選項卡更改時間,並獲取其索引。JTabbedPane ChangeListener

下面的代碼工作,但它觸發的println多次標籤當前裝載量:

tabbedPane.addChangeListener(new ChangeListener() { 
    public void stateChanged(ChangeEvent e) { 
     System.out.println("Tab: " + tabbedPane.getSelectedIndex()); 
     // Prints the string 3 times if there are 3 tabs etc 
    } 
}); 

什麼是這樣做的正確方法是什麼?先謝謝你。

以下演示代碼
+0

檢查:http://www.exampledepot.com/egs/javax.swing/tabbed_TpEvt.html它是否幫助你嗎? –

+0

不,實際上它使用與我的示例相同的方法 – vemv

+0

對不起,但是如果您想要在選定選項卡更改時檢測到ID,那麼您是否需要通過getSource()知道ChangeEvent的位置?恕我直言,也許我錯了,代碼打印出3次(如果你有3個選項卡),因爲我們不知道事件的「來源」。如果代碼不知道哪些標籤已更改,如何更改所選標籤的ID? –

回答

46

通過JDK 6更新26(Windows 7的64位),我只得到一個事件:

public static void main(String[] args) { 
    JFrame frame = new JFrame(); 
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
    frame.setBounds(0, 0, 300, 400); 
    frame.setLayout(null); 
    final JTabbedPane tabbedPane = new JTabbedPane(); 
    tabbedPane.addTab("One", new JPanel()); 
    tabbedPane.addTab("Two", new JPanel()); 
    tabbedPane.addTab("Three", new JPanel()); 
    tabbedPane.addChangeListener(new ChangeListener() { 
     public void stateChanged(ChangeEvent e) { 
      System.out.println("Tab: " + tabbedPane.getSelectedIndex()); 
     } 
    }); 
    tabbedPane.setBounds(0, 0, 300, 400); 
    frame.add(tabbedPane); 
    frame.setVisible(true); 
} 

你能在爲什麼監聽器被觸發三次調試搞清楚?

+21

好吧,我很笨。添加「ChangeListener」的代碼位於添加「Tab」的相同塊中,因此我爲每個選項卡添加了一個偵聽器。 – vemv

8

例如

import java.awt.*; 
import javax.swing.*; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 

public class TestTabbedPane { 

    public static void main(String[] args) { 
     Runnable r = new Runnable() { 

      @Override 
      public void run() { 
       final JPanel ui = new JPanel(new BorderLayout(1, 1)); 
       JTabbedPane jtp = new JTabbedPane(JTabbedPane.LEFT); 
       jtp.addTab("Apple", new JLabel("Apple")); 
       jtp.addTab("Banana", new JLabel("Banana")); 
       jtp.addTab("Cherries", new JLabel("Cherries")); 
       jtp.addTab("Grapes", new JLabel("Grapes")); 
       ui.add(jtp, BorderLayout.CENTER); 
       jtp.setPreferredSize(new Dimension(200, 200)); 
       jtp.addChangeListener(new ChangeListener() { 

        @Override 
        public void stateChanged(ChangeEvent e) { 
         if (e.getSource() instanceof JTabbedPane) { 
          JTabbedPane pane = (JTabbedPane) e.getSource(); 
          System.out.println("Selected paneNo : " + pane.getSelectedIndex()); 
         } 
        } 
       }); 
      } 
     }; 
     SwingUtilities.invokeLater(r); 
    } 

    private TestTabbedPane() { 
    } 
} 

printOut的

run: 
Selected paneNo : 1 
Selected paneNo : 2 
Selected paneNo : 3 
BUILD SUCCESSFUL (total time: 7 seconds)