Pregunta

Muy bien, aquí está mi problema:

Tengo una aplicación con la que estoy trabajando que crea un cuadro de diálogo que tiene un JTree.Cuando alguien hace clic derecho en JTree, necesito determinar si está en la carpeta 2010.Si es así, necesito crear un menú emergente con una opción:"Migrar a 2011".

Lo que tengo ahora es que tengo el menú emergente con el texto correcto y lo cierro cuando hago clic en él o cuando hago clic fuera.Sin embargo, cuando hago clic en Migrar a 2011 no sucede nada, no ejecuta mi ActionPerformed y genera un parpadeo extraño en la parte superior de la ventana de diálogo.

Creé una nueva clase para intentar diagnosticar el problema, pero me encuentro con un problema nuevo.Esta es la clase secundaria que creé para intentar descubrir qué estaba mal. Cuando la ejecuto, se completa bien y abre bien el elemento del menú.Sin embargo, cuando hace clic en la opción de menú, en realidad no cierra el menú, sino que solo ejecuta el método ActionPerformed y nada más.

Aquí está el ejemplo de código:

//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);
  }
}
¿Fue útil?

Solución

La forma correcta de mostrar JPopupMenu es usar su show método.Échale un vistazo al API:

Además de eso sugiero usar Actions en lugar de simples oyentes de acción.Son más flexibles y se pueden utilizar no sólo en menús sino también en barras de herramientas, etc.Aquí hay algo para leer sobre las acciones:

http://download.oracle.com/docs/cd/E17409_01/javase/tutorial/uiswing/misc/action.html

Otros consejos

Use evento mouseelizado en 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(""); 
  } 

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top