Вопрос

Мне было интересно, есть ли способ реализовать прослушиватель действий для Jbutton без имени.Например, у меня есть следующий цикл for, который создает кнопку для каждой буквы алфавита.

for (int i = 65; i < 91; i++){
     alphabetPanel.add(new JButton("<html><center>" + (char)i));
}

Есть ли способ, которым я могу добавить прослушиватель действий для каждой из этих кнопок, не избавляясь от моего цикла for и жестко кодируя каждую JButton, а затем создавая прослушиватель действий для каждой?

Заранее спасибо,

Томек

Это было полезно?

Решение

Ваш вопрос немного расплывчат.было бы тривиально изменить цикл, чтобы добавить слушателя внутри цикла:

ActionListener listener = something;

for (int i = 65; i < 91; i++){
     JButton button = new JButton("<html><center>" + (char)i);
     button.addActionListener( listener );
     alphabetPanel.add(button);
}

если вы не можете изменить цикл, вы могли бы выполнить итерацию по всем дочерним элементам панели и добавить прослушиватели к любому из дочерних элементов, которые являются jbuttons.

кроме того, почему вы используете html для центрирования текста?разве это не перебор?разве jbutton уже не центрирует текст?
вы могли бы использовать setHorizontalAlignment(SwingConstants.CENTER), чтобы сделать это тоже.

Другие советы

В чем проблема этого?

for (int i = 65; i < 91; i++){
     JButton button = new JButton("<html><center>" + (char)i));
     button.addActionListener( new ButtonListener());
     alphabetPanel.add(button);
}

...

class ButtonListener implements ActionListener {
     ButtonListener() {
     }
     public void actionPerformed(ActionEvent e) {
         //TODO:
     }
}

Кроме того, если текст кнопки не идентифицирует кнопку, вы могли бы задать название кнопки с помощью буквы алфавита.

button.setName((char)i)); // or button.setName(i);

Говоря named, вы, по-видимому, имеете в виду сохранение экземпляра button в локальной переменной вашего непосредственного метода.Попытка избежать этого, скорее всего, сделает ваш код более трудным для чтения.Но чтобы ответить на ваш вопрос:

Самый очевидный способ - использовать старую, но недавно ставшую популярной идиому с двойными скобками.

alphabetPanel.add(new JButton("<html><center>" + (char)i) {{
    addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent event) {
            ...
        }
    });
}});

Обратите внимание, что в этом случае, поскольку i не является окончательным, его нельзя будет использовать из анонимного внутреннего класса.Либо присвоите его другой (конечной) переменной, либо переформулируйте цикл.

Другим путем было бы пройти через Действие.(Обычно я бы посоветовал избегать Действий, поскольку они просто являются хэш-таблицей бедняка.Хотя ButtonModel - это "хорошо".)

alphabetPanel.add(new JButton(new AbstractAction("<html><center>" + (char)i) {
    public void actionPerformed(ActionEvent event) {
        ...
    }
}));

Тогда, конечно, существует способ библиотеки для конкретного приложения:

Form alphabetForm = new Form(alphabetPanel);
for (char c='A'; c <= 'Z'; ++c) {
    alphabetForm.button("<html><center>" + c, new ActionListener() {
        public void actionPerformed(ActionEvent event) {
            ...
        }
    });
}

Можно добавить ActionListener к анонимным компонентам, как показано ниже:

new JButton().addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent arg0) {
                // TODO your action             
            }           
        });

Однако в вашем случае, когда вы пытаетесь добавить анонимный JButton на свою панель, этот подход не сработает, потому что вместо конструктора JButton будет принят возвращаемый тип метода addActionListener (который является void), как показано ниже:

for (int i = 65; i < 91; i++){
             alphabetPanel.add(new JButton("<html><center>" + (char)i).addActionListener(new ActionListener(){
                    @Override
                    public void actionPerformed(ActionEvent arg0) {
                        // TODO your action             
                    }           
                }));
        }

Приведенный выше код жалуется на недопустимый аргумент для метода panel.add().

Таким образом, в вашем случае вам нужно будет создать именованный экземпляр JButton.

Надеюсь, это прояснит ситуацию.

С наилучшими пожеланиями, Суреш

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top