Подтвердить что ты не робот

Рекомендации Java/Swing GUI (с точки зрения кода)

В отличие от этой вики, я ищу подходящий способ реализации элементов управления Swing GUI с точки зрения кодирования.

Я участвовал в изучении Java и его инструментов графического интерфейса, но я нашел учебник по Интернету после интернет-учебника, который бросает все в main, и я знаю, что это неправильно.

Я также пытался использовать RAD-системы, такие как Netbeans и другие "визуальные" редакторы, но к тому времени, когда я получу кодирование, у меня есть куча кода, который я не знаю, половину того, что он делает, поэтому я намерение научиться сдавать код качели, и я знаю основные элементы управления и макет, но хочу сделать это правильно.

Есть ли модель или стандарт, которых я не вижу?

примеры вопросов...

Я могу расширить JFrame и создать собственный объект фрейма? (Я бы предположил, что да)

Я инкапсулирую основное меню внутри этого объекта рамки? или я создаю его? и т.д...

Как отделить логику "Просмотр" от логики "Приложения"?

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

4b9b3361

Ответ 1

Поскольку, похоже, есть некоторые аргументы в отношении того, что составляет "лучшие практики", я дам вам то, что я нашел, работает лучше всего для меня, и мои рассуждения:

1. Каждое окно должно расширять либо JFrame, либо JDialog (в зависимости от типа окна). Это упрощает управление свойствами окна без указания конкретного объекта каждый раз. Это скорее общий случай, поскольку, как мне известно, это делается в обоих направлениях.

2. Метод main() должен быть в отдельном классе. Это увеличивает вероятность того, что вы сможете использовать ваши классы окон в другом месте, поскольку они не привязаны к конкретным реализациям. Технически это не имеет значения, но код запуска приложения просто не принадлежит окну.

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

Вот простое приложение с одним фреймом для демонстрации этих практик:

public class Main {
    public static void main(String[] args) {
        final String text = args[0];
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                final MyWindow wnd = new MyWindow(text);
                wnd.setVisible(true);
            }
        });
    }
}

public class MyWindow extends JFrame {
    public MyWindow(String text) {
        super("My Window");

        setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                MyWindow.this.setVisible(false);
                MyWindow.this.dispose();
            }
        });

        final JButton btn = new JButton(text);
        btn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(MyWindow.this, "Button Pressed", "Hey", JOptionPane.INFORMATION_MESSAGE);
            }
        });

        setLayout(new FlowLayout());
        add(btn);
        pack();
    }
}

Ответ 2

Я согласен со всеми пунктами Джонатана.

  1. Каждое окно должно расширять JFrame или JDialog...

  2. Метод main() должен быть в отдельном классе...

  3. Слушатели должны быть в анонимных внутренних классах...

Я также хотел бы добавить следующее:

  1. Используйте GridBagLayout (GBL) разумно. GBL - это мощный менеджер макетов, сложный в освоении, но довольно мощный.

  2. Рассмотрим ручное кодирование всех ваших интерфейсов. Я лично не фанат кода, который создается визуальными редакторами. Но, с учетом сказанного, я не использовал визуальный редактор в течение нескольких лет (2000). Они могли бы быть лучше в этом пункте.

  3. Используйте JPanels разумно. Посмотрите на свой пользовательский интерфейс и определите, какие компоненты должны вести себя так же, как при изменении размера экрана, а затем сгруппируйте эти компоненты вместе на JPanel. Попробуйте использовать JPanels внутри JPanels, чтобы получить правильное поведение при изменении размера.

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

Кроме того, действительно изучите использование MVC и многоуровневой архитектуры. Действительно лучше не смешивать пользовательский интерфейс и бизнес-логику.