Java actionListener для безымянного JButton? - PullRequest
0 голосов
/ 12 ноября 2008

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

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

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

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

Томек

Ответы [ 4 ]

4 голосов
/ 12 ноября 2008

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

ActionListener listener = something;

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

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

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

2 голосов
/ 12 ноября 2008

В чем проблема это сделать?

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);
1 голос
/ 12 ноября 2008

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

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

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

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

Другой путь - пройти через Действие. (Обычно я бы рекомендовал избегать действий, поскольку они являются хэш-таблицей бедного человека. Однако 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) {
            ...
        }
    });
}
0 голосов
/ 12 ноября 2008

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

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

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

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.

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

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

...