Присваивание имени JMenuItem его ActionListener - PullRequest
2 голосов
/ 25 января 2012

Как я могу дать мои JMenuItem имена, на которые будет смотреть ActionListener, прикрепленный к ним?

У меня есть система меню, которая обрабатывается одним ActionListener, и некоторые элементы в этих меню повторяются. Это не проблема на стороне пользователя, потому что очевидно, что и для чего; на самом деле, было бы более запутанным, если бы у них были разные имена. Однако, в конце концов, я хочу, чтобы каждый элемент был уникальным.

Раздел, который создает мои предметы, выглядит так:

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

Опрос элемента впоследствии (и вне области действия этого метода) с помощью getName () дает имя, которое я дал ему, как и должно быть, но вывод

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

- это, возможно, дублированное имя, которое видит пользователь, указанное label, а не уникальное имя, которое я ему дал.

Как я могу предоставить правильную информацию ActionListener?

Ответы [ 2 ]

5 голосов
/ 25 января 2012

другой способ реализации внутреннего ActionListener setActionCommand(String actionCommand)) для всего JMenu записывается java.swing.Action для каждого из JMenuItem илиреализует EventHandler (похоже, действителен для всех Listeners, которые я пробовал)

пример с JButton и с реализованными ActionListener и EventHandler (оба Listeners события стрельбы)

EDIT: EventHandler слишком хакерский, потому что в Swing нет другого прямого метода, как вызывать code_block по строковому значению

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<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();
            }
        });
    }
}
4 голосов
/ 25 января 2012

Почему вы не звоните setActionCommand по пункту меню.Вместо использования setName, если вы звоните setActionCommand, вы должны получить то, что ожидаете, когда звоните getActionCommand

Кроме того, его метка , а не метка .

...