2013-05-09 1 views
0

J'écris un programme en Java où j'utilise JTabbedPane. Chaque onglet est associé à un panneau différent avec des étiquettes, des champs de texte et un bouton. J'ai utilisé GridBagLayout dans les panneaux. J'ai ajouté un actionlistener au bouton, mais quand je clique dessus, rien ne se passe. EDIT: J'ai également d'autres boutons en dehors du JTabbedPane qui fonctionne parfaitement bien.Rien ne se passe quand on clique sur le bouton

Je vois que rien ne se passe parce que je fais:

public void actionPerformed(ActionEvent e) { 
    if (e.getSource() == button) { 
     System.out.println("blablabla"); 
    } 

et rien est imprimé.

Existe-t-il des problèmes courants lors de l'utilisation des boutons et de GridBagLayout/JTabbedPane?

EDIT avec SSCCE

import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.KeyEvent; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 
import javax.swing.*; 

public class Hjelp extends JFrame { 
    private FlowLayout layout; 
    private JButton button1; 
    private JButton button2; 
    private JPanel menu, frontpage; 
    private JPanel present, previous, something; 

    public Hjelp() { 
     layout = new FlowLayout(FlowLayout.CENTER, 10, 20); 
     setLayout(layout); 
     setSize(900, 900); 
     setLocationRelativeTo(null); 
     setVisible(true); 
     setPanels(); 
     something = something(); 
     add(something, BorderLayout.CENTER); 
     something.setVisible(false); 
     button1 = new JButton("CLICK ME"); 
     add(button1); 
     buttonListener(); 
    } 

    private void buttonListener() { 
     Buttonlistener listener = new Buttonlistener(); 
     button1.addActionListener(listener); 
     button2.addActionListener(listener); 

    } 

    private void setPanels() { 
     menu = new JPanel(new FlowLayout(FlowLayout.CENTER, 10, 0)); 
     frontpage = new JPanel(); 
     previous = frontpage; 
     present = frontpage; 
     add(menu); 
    } 

    public void visiblePanel() { 
     previous.setVisible(false); 
     present.setVisible(true); 
    } 

    private JPanel something() { 
     visiblePanel(); 
     JPanel panel = new JPanel(); 
     panel.setLayout(new GridLayout(1, 1)); 
     JTabbedPane tabbedPane = new JTabbedPane(); 

     JComponent panel1 = tab(); 
     tabbedPane.addTab("Click me", panel1); 
     tabbedPane.setMnemonicAt(0, KeyEvent.VK_1); 

     tabbedPane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT); 

     panel.add(tabbedPane); 

     return panel; 
    } 

    private JComponent tab() { 
     JPanel panel = new JPanel(false); 
     panel.setPreferredSize(new Dimension(870, 300)); 
     panel.setLayout(new GridBagLayout()); 
     GridBagConstraints cs = new GridBagConstraints(); 
     cs.fill = GridBagConstraints.HORIZONTAL; 
     button2 = new JButton("Click me"); 
     cs.gridx = 1; 
     cs.gridy = 6; 
     cs.gridwidth = 1; 
     panel.add(button2, cs); 
     return panel; 
    } 

     private class Buttonlistener implements ActionListener { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      if (e.getSource() == button1) { 
        present = something; 
        button1.setVisible(false); 
        something(); 
        previous = something; 
       } 
       else if (e.getSource() == button2) { 
        System.out.println("Blablabla"); 
       } 

     } 
    } 



    public static void main(String [] args) { 
     final Hjelp vindu = new Hjelp(); 
     vindu.addWindowListener(
         new WindowAdapter() { 
          @Override 
          public void windowClosing(WindowEvent e) { 
           System.exit(0); 
          } 
         }); 
    } 

} 

SOLVED

Solution

+2

Problèmes avec les boutons ou la mise en page ou tabbe d volet? Non, ils font partie de Java depuis la version 1.0/1.1 en 1999. C'est vous et votre code. Vous n'avez probablement pas ajouté la classe Listener au bouton. – duffymo

+1

Pour une meilleure aide plus tôt, postez un [SSCCE] (http://sscce.org/). –

+2

@Vulcan Quel est le problème avec '=='? Ceci est une comparaison d'identité. –

Répondre

3

Vous n'avez pas besoin du chèque getSource du tout — votre auditeur est (je l'espère) attaché à un seul bouton , donc s'il a été invoqué, cela signifie déjà que le bouton a été cliqué. Retirez la vérification et imprimez inconditionnellement votre chaîne. Si vous ne voyez toujours rien, alors vous avez un problème.

+0

En fait, mon écouteur n'est pas attaché à un seul bouton. Je suis désolé si mon code était trompeur. Voir ma modification. Merci pour votre temps si! – Camilla

+0

Alors pourquoi n'imprimez-vous pas quelque chose à chaque fois que votre écouteur est déclenché? '' getSource', d'après mon expérience, n'est pas un mécanisme très fiable. Vous feriez mieux de garder ce que tout le monde fait, qui utilise des classes anonymes, chacune dédiée à son propre bouton. –

0

Vous n'avez peut-être pas associé un gestionnaire au bouton actuel, et l'événement ne sera jamais appelé.

Partie 1:

 ButtonHandler handler = new ButtonHandler(); 
     button.addActionListener(handler); 

Partie 2:

public class ButtonHandler implements ActionListener 
    { 
     @Override 
     public void actionPerformed(ActionEvent event) {  

     } 
    } 

AUSSI: Java GUI peut être tatillon, plutôt que d'utiliser « e.getSource() bouton == "vous pourriez essayer" button..isFocusOwner() "

+0

J'ai attaché un gestionnaire au bouton. Voir mon code ici [link] (http://pastie.org/7823774) – Camilla

+0

@Camilla oui je crois que vous l'avez fait (façon étrange de le faire) alors essayez de changer le bouton "e.getSource() ==" en "button1 .isFocusOwner() "et voyez ce que ça fait. – AdamGreenhill

Questions connexes