2010-07-20 2 views
1

Bon, voici mon problème:erreurs JPopupMenu, ne pas sélectionner ou de fermeture

J'ai une application, je travaille avec qui crée une boîte de dialogue qui a un JTree en elle. quand quelqu'un clique droit sur le JTree j'ai besoin de déterminer si c'est dans le dossier 2010. Si c'est le cas, je dois créer un menu contextuel avec une option: "Migrer vers 2011".

J'ai eu maintenant est que j'ai le menu apparaître avec le bon texte, et ferme quand je clique dessus ou quand je clique. Cependant, quand je clique sur Migrer vers 2011 rien ne se passe, il ne va pas exécuter mon ActionPerformed, et fait un clignotement bizarre en haut de la fenêtre de dialogue.

J'ai créé une nouvelle classe pour essayer de diagnostiquer le problème, mais je rencontre un nouveau problème. C'est la classe de côté que j'ai faite pour essayer de comprendre ce qui n'allait pas, quand je l'exécute, elle se remplit bien et ouvre bien le menuitem. Toutefois, lorsque vous cliquez sur l'option de menu, il ne ferme pas le menu, mais exécute uniquement la méthode ActionPerformed et rien d'autre.

Voici l'exemple de code:

//Import statements 

public class MainClass extends JPanel { 

    public MainClass() { 
    final JPopupMenu popup = new JPopupMenu(); 
    final JTree tree; 
    final JTextField jtf; 

    JMenuItem menuItem = new JMenuItem("Migrate to 2011"); 
    ActionListener actionlistener = new PopupActionListener(); 
    menuItem.addActionListener(actionlistener); 
    popup.add(menuItem); 

    DefaultMutableTreeNode top = new DefaultMutableTreeNode("Options"); 

    DefaultMutableTreeNode a = new DefaultMutableTreeNode("A"); 
    top.add(a); 
    DefaultMutableTreeNode a1 = new DefaultMutableTreeNode("A1"); 
    a.add(a1); 
    DefaultMutableTreeNode a2 = new DefaultMutableTreeNode("A2"); 
    a.add(a2); 

    DefaultMutableTreeNode b = new DefaultMutableTreeNode("B"); 
    top.add(b); 
    DefaultMutableTreeNode b1 = new DefaultMutableTreeNode("B1"); 
    b.add(b1); 
    DefaultMutableTreeNode b2 = new DefaultMutableTreeNode("B2"); 
    b.add(b2); 
    DefaultMutableTreeNode b3 = new DefaultMutableTreeNode("B3"); 
    b.add(b3); 

    tree = new JTree(top); 

    JScrollPane jsp = new JScrollPane(tree); 

    add(jsp, BorderLayout.WEST); 

    jtf = new JTextField("", 20); 
    add(jtf, BorderLayout.EAST); 

    tree.addMouseListener(new MouseAdapter() { 
     public void mouseClicked(MouseEvent ae) { 
     popup.setVisible(false); 
     TreePath tp = tree.getPathForLocation(ae.getX(), ae.getY()); 
     if (tp != null) 
      jtf.setText(tp.toString()); 
     else 
      jtf.setText(""); 

     if(SwingUtilities.isRightMouseButton(ae)){ 
      popup.setLocation(ae.getLocationOnScreen()); 
      popup.setVisible(true); 
     } 
     } 
    }); 

    } 

    class PopupActionListener implements ActionListener { 
      public void actionPerformed(ActionEvent ae) { 
      System.out.println("it works!"); 
      } 
     } 

    public static void main(String[] args) { 
    JFrame frame = new JFrame(); 
    frame.getContentPane().add(new MainClass()); 

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setSize(300, 450); 
    frame.setVisible(true); 
    } 
} 

Répondre

1

Utiliser événement mouseReleased dans MouseAdapter

public void mouseReleased(MouseEvent ae) { 
    if(ae.isPopupTrigger()){ 
     popup.show(ae.getComponent(),ae.getX(),ae.getY()); 
    } 
    TreePath tp = tree.getPathForLocation(ae.getX(), ae.getY()); 
    if (tp != null) 
     jtf.setText(tp.toString()); 
    else 
     jtf.setText(""); 
    } 
Questions connexes