Как мне организовать свои действия в Swing?
В настоящее время я заменяю свои анонимные ActionListeners
new ActionListener() {
@Override
public void actionPerformed(final ActionEvent event) {
// ...
}
}
с файлами классов, представляющими действия:
public class xxxxxxxAction extends AbstractAction {
}
Однако мой графический интерфейс способен выполнять множество действий (например, CreatePersonAction, RenamePersonAction, DeletePersonAction, SwapPeopleAction и т. Д.).
Есть ли хороший способ организовать эти классы в какую-то последовательную структуру?
3 ответа
Вы можете хранить свои действия в отдельном пакете, чтобы изолировать их. Иногда полезно хранить их в одном классе, особенно если действия связаны или имеют общего родителя, например:
public class SomeActions {
static class SomeActionX extends AbstractAction {
@Override
public void actionPerformed(ActionEvent e) {
}
}
static class SomeActionY extends AbstractAction {
@Override
public void actionPerformed(ActionEvent e) {
}
}
static class SomeActionZ extends AbstractAction {
@Override
public void actionPerformed(ActionEvent e) {
}
}
}
Затем для доступа к ним:
JButton button = new JButton();
button.setAction(new SomeActions.SomeActionX());
Я просто чувствую напряжение от преобразования ~60 ActionListeners в отдельные классы.
Только вы можете решить, если 60
минимален В этом примере используются четыре экземпляра одного класса. StyledEditorKit
можно увидеть хороший пример, если группировать как серию статических фабричных методов. В приведенном здесь примере используются вложенные классы. JHotDraw
Приведенное здесь динамически генерирует подходящие действия.
Прежде всего, вы должны предоставить открытые методы для всех actionPerformed, используемых в ваших действиях (createPerson, removePerson и т. Д.). Все эти методы действия должны быть в одном классе (я называю это PersonController). Чем вам нужно определить ваш AbstractPersonAction:
public class AbstractPersonAction extends AbstractAction {
private PersonController controller;
public AbstractPersonAction(PersonController aController) {
controller = aController;
}
protected PersonController getContrller() {
return controller;
}
}
Теперь вы можете извлечь все свои действия в отдельные классы.
public class CreatePersonAction extends AbstractPersonAction {
public CreatePersonAction(PersonController aController) {
super(controller);
}
public void actionPerformed(ActionEvent ae) {
getController().createPerson();
}
}
Эти действия могут быть частью внешнего класса или помещаться в отдельный пакет "действий".