Dando o nome de JMenuItem ao seu ActionListener

Como posso dar os nomes do meu JMenuItem que o ActionListener anexado a eles vai olhar?

Eu tenho um sistema de menu que é tratado por um único ActionListener , e alguns itens nesses menus duplicam nomes. Isso não é um problema no lado do usuário, porque é óbvio o que faz o quê; na verdade, seria mais confuso se eles tivessem nomes diferentes. No entanto, no meu final, quero rotular cada item com exclusividade.

A seção que cria meus itens se parece com isso:

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

Interrogando o item depois (e fora do escopo deste método) com getName () dá o nome que eu dei a ele, como deveria, mas a saída de

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

é o nome possivelmente duplicado que o usuário vê, especificado pelo label , não o nome exclusivo que eu forneci.

Como posso fornecer as informações corretas para o ActionListener?

Por que você não está chamando setActionCommand no setActionCommand . Em vez de usar setName , se você chamar setActionCommand , deverá obter o que espera quando chamar getActionCommand

Além disso, seu label não é legível .

outra maneira de implementar ActionListener interno (com setActionCommand(String actionCommand) ) para todo JMenu é escrever java.swing.Action para cada um de JMenuItem ou implementa EventHandler (parece como válido para todos os Listeners que eu tentei)

exemplo sobre JButtons e com ActionListener e EventHandler implementados (ambos os ouvintes acionando events)

EDIT: EventHandler so muito hacky, porque no Swing não é outro método direto como chamar code_block pelo valor da cadeia

 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://stackoverflow.com/questions/7702697 */ public class GridButtonPanel extends JPanel { private static final int N = 2; private final List list = new ArrayList(); 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(); } }); } } 
Intereting Posts