У меня есть JPanel со многими объектами и одним основным действием, которое можно выполнить: вычисление. Для этого есть кнопка, а также JTextField и другие компоненты, в которых пользователь может захотеть нажать Enter. Например, если вы выбираете что-то из JComboBox и нажимаете Enter, произойдет вычисление. Есть ли простой способ добавить такой слушатель ко всему содержимому из JPanel вместо добавления actionListeners к каждому отдельному компоненту?
Добавить прослушиватель ко всем объектам в JPanel
comment
stackoverflow.com/questions/5344823/?
- person   schedule 04.05.2013
Ответы (3)
JPanel
расширяет JComponent
, который наследует Container
. Вы можете использовать getComponents()
. Вы получаете массив Component[]
, который вы можете перебирать и добавлять для каждого компонента, который является подклассом Component
, например Button
, и добавлять одинаковые ActionListener
для каждого компонента. См. http://docs.oracle.com/javase/6/docs/api/java/awt/Component.html
person
cinhtau
schedule
03.05.2013
Для этого вам, вероятно, потребуется использовать рекурсию, поскольку компоненты вполне могут быть вложены в контейнеры.
- person Hovercraft Full Of Eels; 04.05.2013
@Hovercraft Full Of Eels Я знаю (очень хрупкий, если неправильно использовать) очень простой, настраиваемый, основанный на строковом значении, может генерироваться как параметры на лету
- person mKorbel; 04.05.2013
У @cinhtau правильный подход. Это немного усложняется тем фактом, что не существует общего типа с методом addActionListener. Вы должны проверить каждый случай, для которого вы хотите добавить прослушиватель действий.
public static void addActionListenerToAll( Component parent, ActionListener listener ) {
// add this component
if( parent instanceof AbstractButton ) {
((AbstractButton)parent).addActionListener( listener );
}
else if( parent instanceof JComboBox ) {
((JComboBox<?>)parent).addActionListener( listener );
}
// TODO, other components as needed
if( parent instanceof Container ) {
// recursively map child components
Component[] comps = ( (Container) parent ).getComponents();
for( Component c : comps ) {
addActionListenerToAll( c, listener );
}
}
}
person
wolfcastle
schedule
03.05.2013
вот что я сделал прямо сейчас, и это сработало
private void setActionListeners() {
for (Component c : this.getComponents()){
if (c.getClass() == JMenuItem.class){
JMenuItem mi = (JMenuItem) c;
mi.addActionListener(this);
}
if (c.getClass() == JCheckBoxMenuItem.class){
JCheckBoxMenuItem cmi = (JCheckBoxMenuItem) c;
cmi.addActionListener(this);
}
}
}
person
Korialstrazh
schedule
14.07.2013