menus item ejemplo actionperformed java swing user-interface menu actionlistener

java - ejemplo - Dando el nombre de JMenuItem a su ActionListener



menus en java netbeans (2)

¿Cómo puedo dar los nombres de mi JMenuItem que JMenuItem el ActionListener adjunto a ellos?

Tengo un sistema de menús manejado por un solo ActionListener , y algunos elementos en esos menús duplicados. Esto no es un problema para el usuario, porque es obvio qué hace qué; de hecho, sería más confuso si tuvieran nombres diferentes. Sin embargo, en mi extremo, quiero etiquetar cada elemento de forma única.

La sección que crea mis artículos se ve así:

String label = getLabel(forThisItem); JMenuItem item = new JMenuItem(label); item.setName(parentMenu.getName() + "_" + label); item.addActionListener(actionListener); parentmenu.add(item);

Después de interrogar el elemento (y fuera del alcance de este método) con getName () aparece el nombre que le di, como debería, pero el resultado de

public void actionPerformed(ActionEvent ae) { String actionPerformed = ae.getActionCommand(); System.out.println("actionPerformed: " + actionPerformed); }

es el nombre, posiblemente duplicado, que el usuario ve, especificado por label , no el nombre único que le di.

¿Cómo puedo dar la información correcta al ActionListener?


¿Por qué no llamas a setActionCommand en el elemento de setActionCommand ? En lugar de usar setName , si llama a setActionCommand , debe obtener lo que espera cuando llama a getActionCommand

Además, su etiqueta , no lable .


Otra forma de implementar ActionListener interno (con setActionCommand(String actionCommand) ) para todo JMenu es escribir java.swing.Action para cada uno de JMenuItem o implementar EventHandler (parece ser válido para todos los Listeners que probé)

ejemplo sobre JButtons y con ActionListener y EventHandler implementados (ambos Listeners disparando eventos)

EDITAR: EventHandler demasiado hacky, porque en Swing no hay otro método directo de cómo llamar code_block por valor de cadena

import java.awt.EventQueue; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.beans.EventHandler; import java.util.ArrayList; import java.util.List; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; /** based on @see http://.com/questions/7702697 */ public class GridButtonPanel extends JPanel { private static final int N = 2; private final List<GridButton> list = new ArrayList<GridButton>(); public GridButtonPanel() { super(new GridLayout(N, N)); for (int i = 0; i < N * N; i++) { int row = i / N; int col = i % N; GridButton gb = new GridButton(row, col); gb.addActionListener((ActionListener) EventHandler.create(ActionListener.class, this, "actionName" + row + "A" + col)); list.add(gb); this.add(gb); } } public void actionName0A0() { System.out.println(" Grid at Row 0, Column 0 "); } public void actionName0A1() { System.out.println(" Grid at Row 0, Column 1 "); } public void actionName1A0() { System.out.println(" Grid at Row 1, Column 0 "); } public void actionName1A1() { System.out.println(" Grid at Row 1, Column 1 "); } private GridButton getGridButton(int r, int c) { int index = r * N + c; return list.get(index); } private class GridButton extends JButton { private int row; private int col; public GridButton(int row, int col) { super("Row - " + row + ", Col - " + col); this.row = row; this.col = col; this.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { int r = GridButton.this.row; int c = GridButton.this.col; GridButton gb = GridButtonPanel.this.getGridButton(r, c); System.out.println("r" + r + ",c" + c + " " + (GridButton.this == gb) + " " + (GridButton.this.equals(gb))); } }); } } private void display() { JFrame f = new JFrame("GridButton"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.add(this); f.pack(); f.setLocationRelativeTo(null); f.setVisible(true); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { new GridButtonPanel().display(); } }); } }