Как получить доступ к источнику ActionEvent, когда ActionListener находится в другом классе? - PullRequest
1 голос
/ 07 июня 2011

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

В «представлении»:

// ControlForms.java

...

private JPanel createSearchPanel() throws SQLException {

...

comboBoxCode = new JComboBox(); // Field comboBoxCode -> JComboBox()
    SwingUtilities.invokeLater(new Runnable() {  
        public void run() {  
            AutoCompleteSupport<Object> support = AutoCompleteSupport.install(
comboBoxCode, GlazedLists.eventListOf(jnlCodeArray));
        }  
    });  // Auto-Complete comboBox from GlazedLists

...

public void setComboListener(ComboListener comboListener) {
    comboBoxCode.addActionListener(comboListener);
}

...

}

Тогда, как я называю контроллер, у меня есть два разных класса:

// Controller.java

    public MyController() throws SQLException {
...
    addListeners();
}

...

    private void addListeners(){
    View view = getView();
    getView().getControlForm().setComboListener(new ComboListener());

}

и

public class ComboListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
    System.out.println("ComboBox listened to! e = " + e.toString());
}
}

Теперь, e, очевидно, не дает имя переменной (что в данный момент мне бы хотелось), поэтому я не могу if проверить e.getSource().

Мой вопрос таков: есть ли либо a) способ запроса (например, через if) источника e или b) менее сложный способ получить имя переменной?

Большое, большое спасибо заранее за ваши идеи и советы!

Ответы [ 2 ]

3 голосов
/ 07 июня 2011

Зачем вам имя переменной?Почему вы не можете выполнить обработку событий, как это

public class ComboListener implements ActionListener 
{
    public void actionPerformed(ActionEvent e) 
    {
        JComboBox source = (JComboBox)e.getSource();

        //do processing here
    }
}

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

0 голосов
/ 07 июня 2011

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

Тем не менее, прямой ответ на ваш вопрос таков: вам не нужно проверять внутри вашей реализации ActionListener, чтобы увидеть, является ли соответствующий объект источником события; Вы должны просто добавить ActionListener к этому одному объекту.

Последнее замечание: не зная специфики вашей архитектуры ... в общем, MVC будет обрабатывать всю обработку событий как часть представления (это уменьшает связь), а представление будет передавать команды или вызовы методов или ваши собственные события (т.е. , а не Swing) к контроллеру.

...