Каковы Ваши лучшие шаблоны разработки Swing и подсказки? [закрытый]

button('hey') вызывает функцию, а не устанавливает ее как обратный вызов.

35
задан David Grant 30 January 2009 в 16:45
поделиться

15 ответов

Используйте менеджеров по расположению. Вы могли бы думать, что более просто только расположить все с трудными кодированными положениями теперь (особенно при использовании графического разметочного инструмента) но когда это прибудет время, чтобы обновить gui или интернационализировать его, преемники будут ненавидеть Вас. (Доверяйте мне на этом, я был парнем, говорящим для использования менеджеров по расположению от запуска и преемника парня, который проигнорировал меня.)

15
ответ дан Paul Tomblin 10 October 2019 в 11:24
поделиться

Я думаю, что основной проблемой, с которой Вы собираетесь быть сталкивающимися, является тестируемость Вашего gui приложения.

Так относительно пригодности для обслуживания и простоты поблочного тестирования я склоняюсь к "Предъявителю сначала" идиома вместо Образцового контроллера представления (MVC) и других производных, которые дают Вам команду иметь знание представления логики реального приложения (Модель). Лучший ресурс веб-сайт из группы, которая представила его как мысль.

Начиная с использования подхода как этот собирается взять много шаблонного кода для инициализации различных элементов приложения, которое я также предложил бы в использовании платформы внедрения зависимости. Я обосновался с Guice.

1
ответ дан Yorgos Pagles 10 October 2019 в 11:24
поделиться

Взгляните на среду разработки приложения API ( https://appframework.dev.java.net / и http://java.sun.com/developer/technicalArticles/javase/swingappfr/ . Это - большой API для создавания приложения колебания. например: все стили (цвет, шрифт, значки...) определяются в простом файле конфигурации.

3
ответ дан Pierre 10 October 2019 в 11:24
поделиться

Вы, как предполагается, не расширяете JFrame, JDialog, JPanel, JButton, классы Janything (хотя определенные расширения поведения таблицы только доступны при расширении его). Можно расширить JComponent, если Вы испытываете желание делать пользовательский компонент. Если, как предполагается, реализуют модели (например, путем расширения абстрактных моделей), слушатели (например, путем расширения адаптеров), но вот именно. Вы обычно не расширяете компоненты колебания, и Вы лучше не делаете это, поскольку это делает Ваш код связанным с реализацией суперкласса.

4
ответ дан Peter Štibraný 10 October 2019 в 11:24
поделиться

Определенно поместите GUI в один класс и логику в другом классе или нескольких классах - до самой большой возможной степени. Если Вы будете использовать MVC (Образцовый Контроллер Представления) шаблон, то это произойдет автоматически. Если Вы не сделаете этого, то GUI быстро станет неудобно в сопровождении сложным.

4
ответ дан Eddie 10 October 2019 в 11:24
поделиться

Попытайтесь не кодировать текст в свое приложение. Swing guis может быть довольно просто написан, чтобы быть управляемым данными, рассмотреть определение Вашего GUI в XML-файле (включая имена компонентов и положения/атрибуты макета).

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

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

Понимают глюки в колебании - только изменяющий компоненты графического интерфейса пользователя от потока AWT, возвращая поток AWT как можно быстрее (породите новый поток, если необходимо сделать что-нибудь, что принимает 100 мс),

Стараются изо всех сил сохранять код DRY - Это может быть реальная проблема программирования с графический интерфейсами пользователя Swing - Снова, управляемый данными код является единственным способом, которым я нашел к не постоянно повторный код как новый JButton ("... ");

, Если Ваши данные являются базирующимся окном свойств, серьезно полагайте, что создание обязательного механизма связывает Ваши средства управления с Вашими данными. Хорошей целью для кода DRY были бы 0 (НУЛЕВЫХ) определенных для управления строк кода на управление, чтобы получить часть данных с Вашей базы данных на Ваш GUI, сделать, чтобы пользователь отредактировал его и вернул его к Вашему DB. Это означает, что необходимо смочь добавить новое управление путем выполнения только изменения данных.

5
ответ дан 2 revs 10 October 2019 в 11:24
поделиться

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

8
ответ дан Peter Štibraný 10 October 2019 в 11:24
поделиться

Избегайте наследовались, когда состав был бы легче.

, Например, я видел много как это:

public class CustomerSupportApp extends JFrame { 
     JList<Customer> customers;
     OtherBusinessComponent importantComponent;

     etc. etc

}

Это смешивает бизнес-логику с презентацией. Это только вносит изменения от трудного до невозможного.

Лучше:

public class CustomerSupportApp { 
     JList<Customer> customers;
     OtherBusinessComponent importantComponent;
     // The app HAS-A frame but not IS-A frame
     JFrame frame;
     etc. etc
}
6
ответ дан OscarRyz 10 October 2019 в 11:24
поделиться

Это - более абстрактный высокоуровневый ответ о том, что Ваш GUI представляет, не механика его..

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

, Например, я записал систему для управления 2 устройствами один с обоих концов строки T1 (своего рода как модемы). Средства управления было действительно трудно постигать - поля как "создают обратную петлю, тестируют сигнал дальнего конца, тестируют комбинации двоичных разрядов ближнего конца, отправляя различные комбинации двоичных разрядов..." (это - огромное упрощение, это было намного хуже, чем это)

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

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

"Средства управления" были значительно более замысловатыми, чем это, но GUI уменьшил его до ТОЧНО, что клиент должен был понять проблему.

После этого у нас были клиенты, возвращающиеся нам говорящий нам, что они никогда не могли понять этот материал прежде, но теперь они полностью получают его!

Эта презентация была бесконечно более важной, чем проводное соединение реализации GUI.

8
ответ дан Bill K 10 October 2019 в 11:24
поделиться

mvc является Вашим другом.

8
ответ дан emeraldjava 10 October 2019 в 11:24
поделиться

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

9
ответ дан Zach Scrivena 10 October 2019 в 11:24
поделиться

Избегайте использования разработчиков расположения GUI (разработчики). Позже это сделает Ваш код намного более чистым и легче поддержать.

14
ответ дан Marko 10 October 2019 в 11:24
поделиться

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

7
ответ дан Paul Tomblin 10 October 2019 в 11:24
поделиться

Никогда не происходите из JDialog, JFrame или JInternalFrame для определения Ваших форм, диалоговых окон...

Скорее происходят из JPanel. Это принесет Вам преимущества follwing:

  • возможность позже измениться от JFrame до JDialog, например (потому что пользователь передумал)
  • можно снова использовать один экземпляр панели от одного JDialog до другого (JDialog являются обычно не допускающими повторное использование, потому что они создаются со ссылкой на их "родителя", кадр или другое диалоговое окно)
  • , можно позже изменить замену JDialog с более функциональным подклассом от сторонней платформы.
19
ответ дан jfpoilpret 10 October 2019 в 11:24
поделиться

Сделайте интенсивное использование шаблона MVC. Вот простой пример того, что я имею в виду:

class Person
{
  String firstName;
  String lastName;
  // and getters and setters...
}

class PersonSwingModel
{
  private Person person;
  private javax.swing.text.PlainDocument firstName;
  private javax.swing.text.PlainDocument lastName;
  // and getters and setters...
  // Create some method like init() that initializes PlainDocument values
  // to attributes in model.
}

class SavePersonAction extends AbstractAction
{
  private PersonSwingModel model;
  // and getters and setters...
}

class PersonSwingView extends JFrame
{
  private PersonSwingModel model;
  private javax.swing.JTextField firstName;
  private javax.swing.JTextField lastName;
  private SavePersonAction savePersonAction; // hook up to JButton/JMenuItem
  // and getters and setters...
  // Create some method like init() which binds PlainDocument to JTextField
  // and Actions to JButtons or JMenuItems
}

Я вижу, что некоторые люди не соглашаются с расширением JFrame или JPanel. Я не делаю. Работы для меня.

Кроме того, используйте LayoutManagers. GridBagLayout очень мощен. Если Вы используете его, определяете некоторые константы GridBagConstraints (как LABEL_GBC и FIELD_GBC) и продолжаете снова использовать их.

6
ответ дан Gary Kephart 27 November 2019 в 06:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: