общий вопрос о Java Swing - PullRequest
       36

общий вопрос о Java Swing

7 голосов
/ 26 декабря 2009

Я сделал приложение Swing, которое довольно просто по функциональности. Однако, на мой взгляд, код, из которого он состоит, стал довольно большим и очень грязным. Все компоненты и действия свинга находятся в одном файле. Так, например, если бы я должен был сделать еще большее приложение с большей функциональностью, код был бы довольно трудным для прохождения.

Так что мой вопрос в том, как сделать хорошую структуру кода. Или, если есть хорошая веб-страница, я могу прочитать об этом и, если возможно, некоторые примеры кода. Я проверил руководство Sun по Swing, но эти довольно упрощенные примеры они показали.

ОБНОВЛЕНИЕ: Я размышляю некоторое время и проверяю некоторые примеры. Я не знаю, правильно ли я получил образец MVC. В любом случае, моя идея состоит в том, чтобы отделить каждый JFrame от своего собственного файла классов. После этого у меня есть один MainFrame, который является основным окном для приложения. Из этого JFrame я создаю один экземпляр каждого JFrame, который у меня есть. И вызвать эти кадры из MainFrame с помощью Actions. Я не знаю, хорошая ли это идея. Однако в любом случае это значительно облегчает чтение кода.

Вот пример того, как я имел в виду

class Main implements ActionListener {

    private JFrame frame = new JFrame();
    private JButton button1 = new JButton();
    private JPanel panel = new JPanel();

    private FirstFrame frame1 = new FirstFrame();
    private SecondFrame frame2 = new SecondFrame();
    private ThirdFrame frame3 = new ThirdFrame();

    public Main() {
        button1.addActionListener(this);
    }

    public createGUI() {
        frame.setTitle("Main");
        frame.setSize(400,300);
        panel.add(button);

        frame.setVisible(true);
        frame.setLocationRelativeTo(null);
    }

    public static void main(String args[]) {
        new Main().createGUI();
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getSource() == button1)
        {
            frame1.enable();
        }
    }
}

Ответы [ 4 ]

8 голосов
/ 26 декабря 2009

Использование Шаблон проектирования Model-View-Controller. Он имеет дело с отделением кода пользовательского интерфейса от бизнес-логики.

РЕДАКТИРОВАТЬ:

Поскольку OP ищет организованный код, а не гибкий дизайн, я удалил часть NetBeans UI Designer из моего ответа.

5 голосов
/ 26 декабря 2009

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

  1. Рефакторинг - очистить после того, как код не работает.
  2. Модель Model View Controller - для разделения проблем.
  3. OO Design - используйте множество маленьких взаимодействующих классов вместо больших кусков кода.
  4. «On event Do action » - идиома для отделения действий от представлений.
  5. UML Component models - визуализация концепций проектирования выше уровня класса.
  6. Принцип инверсии зависимости - организуйте зависимости кода.

Основные методы проектирования существуют уже довольно давно и хорошо понятны, но применение методов в более широком масштабе, по-видимому, разрабатывается индивидуально для каждого приложения.

Один из подходов, который я применил эффективно, состоит в том, чтобы разделить События, Слушатели, Действия и т. Д. На их собственные классы и либо организовать их в пакеты по типу, либо использовать согласованное соглашение об именах для пакетов, чтобы компонент и связанные классы легко идентифицируемы (XDialog, XDialogMouseListener, XDialogCancelAction и т. д.).

Другой подход заключается в том, чтобы взглянуть на некоторые большие приложения с открытым исходным кодом (Eclipse, Firefox, ...) и посмотреть, как они организуют свой код GUI.

2 голосов
/ 26 декабря 2009

Я склонен извлекать как можно больше функций, не связанных с графическим интерфейсом, из компонентов Swing. Это означает, что у вас есть дополнительное косвенное обращение. Тем не менее:

  1. слой Swing ничего не делает, кроме взаимодействия с графическим интерфейсом
  2. бизнес-функциональность намного проще тестировать и, следовательно, поддерживать

Я не обязательно говорю о полной модели MVC (хотя это неплохо). Это скорее проблема организации класса / пакета.

1 голос
/ 26 декабря 2009

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

Ключевые моменты:

  • Используйте многослойный дизайн. Это не просто настойчивость-бизнес-интерфейс. Разделите это лучше. Например, слой макета не должен создавать компоненты (кроме макета, обычно JPanel s).
  • Предпочитаю композицию наследованию. Подклассы вроде JFrame и JPanel очень мало смысла, так что не делайте этого.
  • Держите пользовательский интерфейс тонким. Например, в рендерерах должно быть очень мало логики. Во-первых, это значительно упрощает тестирование (это автоматическое тестирование, крупномасштабное ручное тестирование неэффективно).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...