Как мне организовать свои действия в 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();
  }
}

Эти действия могут быть частью внешнего класса или помещаться в отдельный пакет "действий".

Другие вопросы по тегам