«Вложенные» ActionListeners в Java? - PullRequest
1 голос
/ 17 декабря 2010

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

С точки зрения программного обеспечения было бы проще, если бы я мог заставить пункт меню ActionListeners изменить значение параметра состояния, а затем просто вызвать TextField ActionListener для повторного построения диаграммы.

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

Заранее благодарим за любые идеи.

Джон Донер

Ответы [ 2 ]

2 голосов
/ 17 декабря 2010

Один из способов сделать это состоит в том, чтобы сделать ваш ActionListeners "тонким" и заставить его делегировать частному методу где-нибудь, например:

class Controller {
    ... // variable declarations etc

    public Controller() {
        textField.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {
            setStockSymbol(...);
            replot();
        }});
        menuItem.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {
            setStatusParameter(...);
            replot();
        }});
    }

    private void replot() {
        // Do whatever
    }
}

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

1 голос
/ 17 декабря 2010

Вы пытаетесь создать класс, который будет действовать как подписчик и издатель. Просто пусть ваш класс реализует интерфейс ActionListener, но также предоставляет способ подписки на ActionListener в вашем классе.

public class MyActionSubPub
{
    private List<ActionListener> downstreams = new ArrayList<ActionListener>();
    public MyActionSubPub( AbstractButton(or whatever) button )
    {
        button.addActionListener( this );
    }
    public addActionListener( ActionListener listener )
    {
        downstreams.add( listener );
    }
    public void actionPerformed( ActionEvent event )
    {
        ... do your stuff ...
        ... loop through all downstreams, call actionPerformed on each...
    }
}

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

...