基础Java GUI设计

6
在我们上课使用的GUI书籍中,有许多关于如何在Java中制作图形用户界面的示例。示例很多,以至于我对哪个示例应该在大型应用程序中使用非常困惑。
我见过以下示例:
- 主类扩展JFrame。 - 在main方法内创建JFrame对象。 - 主类扩展JFrame并实现ActionEvent接口。 - 监听器类在主类内部声明。
当然,我可以处理所有这些示例,但是由于我没有任何经验,所以我不知道使用其中任何一个的好处。实际上,有没有一种正确的方法来做,还是要根据我的情况而定呢?
谢谢!

1
我认为你选择哪种方案最终并不重要。在“真正的”应用程序中,您将希望根据MVC原则进行结构化设计,而正确完成这种高级设计比实现视图和控制器之间的绑定(应尽可能薄且“愚笨”)的技术细节更加重要。 - millimoose
4个回答

6
当考虑扩展一个类时,应该问的问题是“Is A”还是“Has A”? 如果新类是“Is A”框架,则扩展框架,但如果类只需要引用框架,就不要扩展
实际上,如果需要自定义组件,可以扩展JComponentJPanel,然后将其添加到框架、应用程序、窗口、JInternalFrame、对话框、布局的约束条件、拆分窗格的一部分等中。
关于监听器。与其在单个actionPerformed()方法中遍历一个巨大的if/else结构来确定所需的操作,更优化的方法是:
1.为每个需要它的控件创建一个监听器。 2.创建一个AbstractAction的实例,可能用于多个控件('复制'按钮、菜单项等)。
因此(通常情况下): 1. JFrame不要扩展。 2.监听器根据需要创建和添加。

对我来说,你不扩展JFrame,但又没有充分的理由去扩展JPanel似乎有些奇怪。(但是可以扩展JApplet,只是不要在子类中做太多事情。) - Tom Hawtin - tackline
@TomHawtin-tackline "没有什么好的理由来扩展JPanel。" 难道我写的内容有这个意思吗?我并没有明确说明何时应该优先选择自定义组件而不是其他方法来创建GUI。但我的观点是,你可能更需要一个自定义组件,而不是自定义框架。我想不出后者有什么用处。 - Andrew Thompson
@trashgod 您的意思是PanelUI吗? - Andrew Thompson
@AndrewThompson:是的;尽管通常很少。 - trashgod

2
说实话,这取决于具体情况。编程时一个基本规则是“编写抽象类或接口的代码”。
因此,简言之,可以让一个类继承(或实现)JFrame(或其他接口或类),或者让另一个类做同样的事情并实现ActionListener接口。
这关乎你的代码的可维护性、灵活性和清晰度。

0

标准方法:在主方法中使用EventQueue创建主窗体。这样,所有操作都将是异步的。


当使用Swing时,这些都是在幕后发生的。我不确定手动执行此操作的意义何在,而且无论如何,这似乎并没有回答OP的问题。 - millimoose
1
你的意思是 public static void main(String[] args) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { methodToStartSwingGUI(); }}); }? 是的,就这样做。 - Tom Hawtin - tackline

0

其中主类扩展JFrame

  • 主类不必扩展JFrame。如果不扩展,则应像其他类一样创建JFrame对象

JFrame对象在主方法内创建

  • 如果MainClass扩展JFrame,则在构造函数中创建(在super()中)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接