Рекомендации по использованию Java / Swing GUI (с точки зрения кода) [закрыто]

18

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

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

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

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

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

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

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

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

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

    
задан jondavidjohn 29.03.2011 в 16:05
источник
  • Это относится к программистам SE ..., где я его уже спросил. –  Pops 29.03.2011 в 16:08
  • Я должен сказать, что не согласен, поскольку я прошу кодировать конкретные примеры. Имея возможность для количественных не-субъективных ответов. Программисты для более субъективных, связанных с профессией вопросов. Однако я ценю вашу информацию и буду рассматривать ответы на ваш вопрос. –  jondavidjohn 29.03.2011 в 16:10
  • Ну, вы должны, вероятно, сказать это явно, тогда ... вы имеете в виду, что вам нужны ответы на три вещи, которые вы указали в разделе «примеры вопросов»? –  Pops 29.03.2011 в 16:13
  • уверен, что в начале я отредактирую, чтобы попытаться сделать себя более ясным. –  jondavidjohn 29.03.2011 в 16:15
  • Вы просите о субъективной помощи. Нет никакого «отраслевого стандарта на организацию кода», потому что это похоже на прошение «одного истинного вывода интеграла» ... учитывая «интеграл x ^ 2». Я хочу, чтобы вы его извлекли, и я хочу, чтобы вы знали, что моя постоянная [опущено], но я не буду говорить вам, что такое моя константа. ~ (моя точка) программирования. Существует множество способов добиться того же конечного результата. Итак, что такое «лучшие практики» для моего магазина, возможно, не «лучшие практики» для вашего магазина. А что касается «интернет-учебников, то все в принципе», потому что они собираются для быстрого ввода кода. –  jcolebrand 29.03.2011 в 16:33

2 ответа

30

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

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();
    }
}
    
ответ дан Jonathan 29.03.2011 в 16:52
  • Разве вы не должны строить свое окно в потоке отправки событий, используя SwingUtilities, а не в основном потоке? –  Andrew Swan 21.03.2013 в 11:27
  • Да, вы правы. Два года спустя я обновил свой ответ. –  Jonathan 13.04.2013 в 05:55
  • Фантастический ответ! Я хотел написать и сказать это, потому что выдержка просто не сокращает его. +1! –  L0j1k 09.06.2013 в 13:02
  • Спасибо, я очень ценю комплимент :-D –  Jonathan 10.06.2013 в 01:48
10

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

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

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

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

  6.   

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

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

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

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

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

Также изучите использование MVC и многоуровневой архитектуры. Лучше всего не смешивать пользовательский интерфейс и бизнес-логику.

    
ответ дан hooknc 29.03.2011 в 17:59
  • «5.) Рассмотрим ручное кодирование всего вашего пользовательского интерфейса. Я лично не являюсь поклонником кода, созданного визуальными редакторами, но, с учетом сказанного, я не использовал визуальный редактор через несколько лет. лучше в этот момент ». Дайте себе перерыв! Взгляните на Netbeans 6.9.1 и Matisse. Вы закончили в кратчайшие сроки, и код, который вы получаете, очень хорош. –  Costis Aivalis 29.03.2011 в 19:43