2012-04-23 42 views
1

我正在用Java构建一个图形用户界面,我想知道是否有人可以给我一些指导。 具体来说,当在这个GUI中点击一个按钮时,一个大的JDialog(它是一个扩展了JDialog的类)打开以供用户输入一些信息,查看一些信息,点击一些东西等。Java/Swing - 如何减小JDialog构造函数的大小?

这个类有多个JLabel和其他组件。我的问题是,如何创建这样一个实例?现在我拥有构造函数中的所有内容,使其成为500(!)行构造函数。必须有一个替代方案! 构造函数大约有300行代码组件的位置和设置,另外还有200行供听众使用。

还附带考虑的另一个问题是,现在我通过调用

MyClassExtendsJDIalog临时打开来自另一类这个窗口=新MyClassExtendsJDIalog();

,但我完全不中,我创建它的类中使用这种“温度”变量,作为“临时”的构造做一切。我似乎又一次以一种错误的方式做事。

感谢您阅读本文。

回答

3

是的,你做错了什么,但你是在好的(或坏的)公司。

您应该应用的良好的面向对象设计和简洁的代码规则,以你的挥杆类为别的。

究竟你能做的就是分不清不看300+行代码(我真的不希望看到;-)但这里有出头是可能适用。

我的主要设计规则是单一责任原则。根据你的描述(和我的猜测),你正在做你的构造如下:

* creating (including configuring) components 

* placing them in some kind of layout 

* registering Listeners 

* implementing Listners 

这是4层完全不同的关注点。

一些沉重的重构之后,你可能最终得到这样的:

您可能希望有一个工厂,创建您的组件。

你可能有一个坐标制图类,它的部件或一组部件(如标签加上匹配文本),并将它们放置在面板上。

你可能有一个类需要的组件(也许机型或其他),并在一起使用监听器的电线。

以及传递这一切使用它以适当的方式,并吐出了一个JDialog与上所有组件面板中的类。

注:Idealy没有延伸的JDialog了。如果您打算构建新的Swing组件,则只应该扩展Janything。

这个例子是使用Scala的,但它仍然应该提供一些启示:http://blog.schauderhaft.de/2011/06/26/clean-code-with-swing-and-scala/

+0

感谢您的支持。我会尝试类似于您的Scala示例。我不关心代码大小,我只是想让它更好地组织起来。你能否解释一下你的意思是不再扩展JDialog?我应该怎么做呢? – 2012-04-24 09:16:39

+0

而不是扩展J *,并在'this'上运行将组件传递给操作它的函数。结果是您可以提取使用JDialog(vs JInternalFrame; JFrame或JPanel)的决定并随意更改。 – 2012-04-24 10:37:52

5

如果你想分离代码以使其更易于阅读和管理,你可以将这些字段分组到JPanel的子类中,即Panel1,Panel2等,然后将它们添加到JDialog子类的构造函数中。但设置一个图形用户界面在挥杆需要很多线,是的...

至于没有使用临时变量,我猜你在构造函数中调用show()? 通常我不会这样做,而是在创建对话框的代码中调用它,即。

MyDialog dialog = new MyDialog(); 
dialog.setVisible(true); 
+0

我的坏...编辑effectuated ...... – 2012-04-23 22:08:28

+0

感谢的变化。 1+ – 2012-04-23 22:08:58

4

在没有看到您的代码的情况下,很难为您提供有关如何改进代码和设计的具体提示。

我同意,〜500线在你的构造直观感觉有问题。至少,您可能希望推迟部分工作,直到实例创建完成。将此转变为方法(或一系列方法)是一种方法。

你也可能想要考虑设计你的类,使它包含一个JDialog而不是扩展一个JDialog(关于这个主题的讨论见Composition over inheritance)否则你会混淆几个类的关注点。

最后,您可能需要查看Java Swing Tutorial一般的技巧和技术,用于创建基于Swing的用户界面。

+0

优秀的建议,比我的好(这我删除,因为它是现在冗余)。 1+ – 2012-04-23 22:08:05