与this wiki形成对比,我正在寻找从编码角度实现Swing GUI控件的正确方法。
我一直在努力学习Java及其GUI工具,但是我发现网络教程之后的互联网教程将所有内容都抛到了main
,我知道这是不对的。
我也尝试过像Netbeans和其他“视觉”编辑器这样的RAD系统,但是当我编写代码时,我有一堆代码,我不知道它的一半,所以我是意图学习手动代码摆动,我知道基本的控件和布局,但想以正确的方式去做。
我缺少一个模型或标准吗?
示例问题......
我是否扩展JFrame并创建自己的框架对象? (我会假设是)
我将主菜单封装在该框架对象中吗?还是我自己创造?等...
如何将“视图”逻辑与“应用程序”逻辑分开?
基本上,我正在寻找关于如何组织GUI代码的行业标准。
答案 0 :(得分:34)
由于关于什么构成“最佳实践”似乎有一些争论,我会告诉你我发现的最适合我的东西,以及我的理由:
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 :(得分:11)
每个窗口都应该扩展JFrame或JDialog ...
main()方法应该在一个单独的类中......
- 醇>
听众应该是匿名的内部班级......
我还想补充以下内容:
4.)明智地使用GridBagLayout(GBL)。 GBL是一个非常强大的布局管理器,难以学习,但功能非常强大。
5.)考虑手动编码所有UI。我个人不是视觉编辑生成的代码的粉丝。但是,据说我在几年内没有使用过可视化编辑器。在这一点上他们可能会更好。
6。)明智地使用JPanels。查看您的ui并确定哪些组件的行为应与屏幕大小相同,然后在JPanel上将这些组件组合在一起。考虑在JPanels中使用JPanel来获得正确的调整大小行为。
我通常采用略微不同的方法让我的组件处理Jonathan所做的事件,但我相信他的方法比我的方法更清洁。
另外,真正研究MVC和分层架构的使用。最好不要将UI和业务逻辑混合在一起。