Java / Swing GUI最佳实践(从代码的角度来看)

与此维基对比,我正在寻找从编码角度实现Swing GUI控件的正确方法。

我一直在寻求学习Java及其GUI工具,但我发现互联网教程之后的互联网教程将所有内容都抛到了main ,我知道这是不对的。

我也尝试过像Netbeans和其他“视觉”编辑器这样的RAD系统,但是当我编写代码时,我有一堆代码,我不知道它的一半,所以我打算学习手动代码摆动,我知道基本的控件和布局,但想以正确的方式做到。

我缺少一个模型或标准吗?

示例问题……

扩展JFrame并创建自己的框架对象? (我会假设是的)

将主菜单封装在该框架对象中? 还是我自己创造? 等等…

如何将“View”逻辑与“Application”逻辑分开?

基本上,我正在寻找关于如何组织GUI代码的行业标准。

由于似乎有一些关于什么构成“最佳实践”的争论,我会告诉你我发现最适合我的东西,以及我的理由:

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(); } } 

我同意乔纳森的所有观点 。

  1. 每个窗口都应该扩展JFrame或JDialog …

  2. main()方法应该在一个单独的类中……

  3. 听众应该是匿名的内部class级……

我还想补充以下内容:

4.)明智地使用GridBagLayout(GBL)。 GBL是一个非常强大的布局管理器,难以学习,但function非常强大。

5.)考虑手动编码所有UI。 我个人不是视觉编辑生成的代码的粉丝。 但是,据说我在几年内没有使用过可视化编辑器。 在这一点上他们可能会更好。

6.)明智地使用JPanels。 查看您的ui并确定哪些组件的行为应与屏幕大小相同,然后在JPanel上将这些组件组合在一起。 考虑在JPanels中使用JPanel来获得正确的resize行为。

我通常采用略微不同的方法让我的组件处理Jonathan所做的事件,但我相信他的方法比我的方法更清洁。

另外,真正研究MVC和分层架构的使用。 最好不要将UI和业务逻辑混合在一起。