2015-07-02 4 views
2

Я пишу программу Java, в которой у меня есть набор кнопок (а не калькулятор!), И я ищу эффективный способ узнать, какой JButton был нажат. Из того, что я знаю о Java до сих пор, единственный способ сделать это - сделать их всех в одном ActionListener, а затем запрограммировать поиск соответствия.Найти индекс Java JButton Array

Другое решение, о котором я только думал, заключается в расширении JButton, чтобы включить в конструктор уникальную идентификационную переменную номера. Кажется, что он должен работать, когда объект события передается JButton после проверки экземпляра. Подобно использованию свойства тега VB, которое присваивается номеру индекса.

Есть ли лучший/элегантный способ?

+0

Вы можете назначить уникальный идентификатор каждому JButton с помощью методов setName и getName. –

+0

Осторожно с помощью 'setName' он может получить' null'ed, если он установлен перед действием. –

+0

Это возможность. Я не знал об этих методах, и они являются частью JComponent. Это хорошая вещь, чтобы знать. Это действительно поможет и в другой программе. Благодаря! –

ответ

-1

Добавить отдельный прослушиватель действий для каждой кнопки.

+0

В массиве, который я буду использовать, есть 64 JButtons. Будут ли какие-либо накладные расходы или замедление, чтобы иметь много ActionListeners? Если бы не так много, было бы немного больше? Это просто для справок в будущем. –

0

Способ, которым я это делал раньше, использовал actionPerformed для разных кнопок. Мне нравится больше по сравнению с другими способами, которые я видел.

public void actionPerformed(ActionEvent clicking) 
{ 
    if (clicking.getSource() == button[0]) 
     // Do this 
    if (clicking.getSource() == button[1]) 
     // Do something different 
} 

Поскольку вы построили массив, вы можете сбросить идентификатор, где это 0, и это ваш уникальный идентификатор.

0

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

public enum Position { 
    BB, SB, BU, CO, MP3, MP2, MP1, EP3, EP2, EP1; 
} 

и имеют некоторый JToggleButtons каждый из них держал IST собственной позиции.

public class PositionButton extends JToggleButton { 
    private final Position p; 

    public PositionButton(Position p) { 
     this.p = p; 
     setText(p.toString()); 
     setActionCommand(p.toString()); 
    } 

    public Position getPosition() { 
     return p; 
    } 
} 

Это позволяет создавать кнопки в цикле и получить значение прямой от кнопки без сравнения:

ActionListener positionListener = new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
     PositionButton b = (PositionButton)e.getSource(); 
     Position p = b.getPosition(); 
     //do something with Position 
    } 
} 

for (Position p : Position.values()) { 
    PositionButton b = new PositionButton (p); 
    b.addActionListener(positionListener); 
} 
5

Есть ли лучше/более элегантный способ?

  • да использовать (почти JComponent с) в put/getClientProperty, то вы можете установить бесконечное количество свойств, может быть умножена в отличие от setName/setActionCommand/и т.д.

  • getClientProperty может быть используется в качестве уникального идентификационным для Swing Action или EventHandler (а не использовать ActionListener)

Ссылки на Javadocs: putClientProperty(), getClientProperty()

+0

См. Также [альтернативный подход] (http://stackoverflow.com/a/7706684/230513). – trashgod

+0

Не знал об этих методах, очень приятно. –

+0

@Sean Bright пожалуйста, какой из них 1 :-). ClientProperty или (мой любимый) 2 :-). EventHandler – mKorbel

Смежные вопросы