How to add action listener that listens to multiple buttons

Чтобы сфокусироваться на конкретном вопросе ("преимущества Классика по сравнению с.Net"), существует только две вещи, я могу думать о Классике, делает это.Net не будет:

1) Включает. Они просто не работают как Вы, ожидают в ASP.NET. Конечно, ASP.NET обеспечивает намного лучшие способы выполнить то же самое, но это - все еще что-то вроде потери и может сделать миграцию старого сайта к.Net болью.

2) ASP.NET не выйдет за предел корневой папки для приложения. Где я в, у нас есть довольно сложная интранет, это - все еще главным образом классический ASP с поверхностным знанием.Net приложений тут и там, поскольку вещи обновляются или новый добавленный материал. Было бы хорошо быть в состоянии продолжить одну копию общего кода довольно высоко в иерархии папок, но все еще иметь каждое отдельное приложение, изолированное к своему собственному VD. Но тогда, это - то, что управление исходным кодом для, так это не имеет большого значения.

Для меня, самым большим преимуществом, перемещающимся от Классического ASP и ASP.NET до сих пор, является IDE. Настолько хорошо быть в состоянии щелкнуть правой кнопкой по вызову функции и выбрать "Go to Definition" вместо того, чтобы иметь необходимость вырыть вокруг для нахождения файла, где функция на самом деле реализована. Огромное средство экономии времени. И поддержка intellisense и безопасность типов, когда вызывание функций является благом также.

28
задан skaffman 9 May 2011 в 11:57
поделиться

1 ответ

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

Используя мой подход, можно записать обработчик событий нажатия кнопки 'классическим способом', точно так же, как как Вы сделали это в VB или MFC ;)

предположим, что у нас есть класс для рамочного окна, которое содержит 2 кнопки:

class MainWindow {
    Jbutton searchButton;
    Jbutton filterButton;
}

можно использовать мой класс 'маршрутизатора' для маршрутизации события назад к классу MainWindow:

class MainWindow {
    JButton searchButton;
    Jbutton filterButton;
    ButtonClickRouter buttonRouter = new ButtonClickRouter(this);

    void initWindowContent() {
        // create your components here...

        // setup button listeners
        searchButton.addActionListener(buttonRouter);
        filterButton.addActionListener(buttonRouter);
    }

    void on_searchButton() {
        // TODO your handler goes here...
    }

    void on_filterButton() {
        // TODO your handler goes here...
    }
}

Вам нравится он? :)

, Если Вы любите этот путь и ненавидите анонимный подкласс Java путь, затем Вы так же стары как я. Проблема 'addActionListener (новый ActionListener {...})' то, что это сжимает все обработчики кнопок в один внешний метод, который заставляет программу выглядеть соединенной проводом. (в случае, если у Вас есть много кнопок в одном окне)

Наконец, класс маршрутизатора в ниже. Можно скопировать его в программу без потребности в любом обновлении.

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

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class ButtonClickRouter implements ActionListener {
    private Object target;

    ButtonClickRouter(Object target) {
        this.target = target;
    }

    @Override
    public void actionPerformed(ActionEvent actionEvent) {
        // get source button
        Object sourceButton = actionEvent.getSource();

        // find the corresponding field of the button in the host class
        Field fieldOfSourceButton = null;
        for (Field field : target.getClass().getDeclaredFields()) {
            try {
                if (field.get(target).equals(sourceButton)) {
                    fieldOfSourceButton = field;
                    break;
                }
            } catch (IllegalAccessException e) {
            }
        }

        if (fieldOfSourceButton == null)
            return;

        // make the expected method name for the source button
        // rule: suppose the button field is 'searchButton', then the method
        // is expected to be 'void on_searchButton()'
        String methodName = "on_" + fieldOfSourceButton.getName();

        // find such a method
        Method expectedHanderMethod = null;
        for (Method method : target.getClass().getDeclaredMethods()) {
            if (method.getName().equals(methodName)) {
                expectedHanderMethod = method;
                break;
            }
        }

        if (expectedHanderMethod == null)
            return;

        // fire
        try {
            expectedHanderMethod.invoke(target);
        } catch (IllegalAccessException | InvocationTargetException e) { }
    }
}

я - новичок в Java (не в программировании), поэтому возможно, в вышеупомянутом коде существует что-либо несоответствующее. Рассмотрите его перед использованием его.

0
ответ дан 28 November 2019 в 02:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: