2011-07-23 7 views
29

Je dois détecter quand l'onglet sélectionné change et obtenir son index.JTabbedPane ChangeListener

Le code suivant fonctionne, mais il tire les println autant de fois que la quantité d'onglets actuellement chargé:

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 
    } 
}); 

Quelle est la bonne façon de le faire? Merci d'avance.

+0

Vérifiez ceci: Est-ce que http://www.exampledepot.com/egs/javax.swing/tabbed_TpEvt.html-il vous aider? –

+0

Non, en fait, il utilise les mêmes méthodes que mon exemple – vemv

+0

Désolé, mais si vous voulez détecter l'ID lorsque l'onglet sélectionné change, n'avez-vous pas besoin de savoir où vous avez l'événement ChangeEvent, avec getSource()? À mon humble avis, peut-être que je me trompe, le code imprime 3 fois (si vous avez 3 onglets) parce que nous ne connaissons pas la «source» de l'événement. Comment pouvez-vous obtenir l'ID de l'onglet sélectionné changé lorsque le code ne sait pas quel onglet a changé? –

Répondre

46

Par JDK 6 Update 26 (Windows 7 64 bits), je ne reçois un événement pour le code de démonstration suivante:

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); 
} 

Pouvez-vous comprendre dans le débogueur pourquoi l'auditeur est déclenché trois fois?

+21

D'accord, je suis stupide. Le code qui ajoute le 'ChangeListener' est dans le même bloc qui ajoute un' Tab' donc j'ajoutais un écouteur par onglet. – vemv

8

par exemple

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)