2011-07-23 10 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を検出したい場合は、ChangeEventのある場所をgetSource()で知る必要はありませんか? IMHO、多分私が間違っている、私たちはイベントの "ソース"を知らないので、コードは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); 
} 

あなたはリスナーが3回トリガされた理由をデバッガに把握することはできますか?

+21

私はばかです。 'ChangeListener'を追加するコードは' Tab'を追加するブロックと同じブロックにあり、タブごとに1つのリスナーを追加しています。 – 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() { 
    } 
} 

プリントアウト

run: 
Selected paneNo : 1 
Selected paneNo : 2 
Selected paneNo : 3 
BUILD SUCCESSFUL (total time: 7 seconds) 
関連する問題