Ответ 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();
}
}