Добавить прослушиватель ко всем объектам в JPanel

У меня есть JPanel со многими объектами и одним основным действием, которое можно выполнить: вычисление. Для этого есть кнопка, а также JTextField и другие компоненты, в которых пользователь может захотеть нажать Enter. Например, если вы выбираете что-то из JComboBox и нажимаете Enter, произойдет вычисление. Есть ли простой способ добавить такой слушатель ко всему содержимому из JPanel вместо добавления actionListeners к каждому отдельному компоненту?


person cvbattum    schedule 03.05.2013    source источник
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
comment
Для этого вам, вероятно, потребуется использовать рекурсию, поскольку компоненты вполне могут быть вложены в контейнеры. - person Hovercraft Full Of Eels; 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