Dav*_*ant 35 java user-interface swing design-patterns
我正在为使用Swing的应用程序编写GUI,为了代码维护和可读性,我希望在整个系统中遵循一致的模式.
我读过的大多数文章和书籍(或至少是书籍部分)似乎提供了大量关于如何创建和安排各种组件的示例,但忽略了编写完整GUI的大局.
有关应用程序GUI设计的最佳技巧是什么?在设计或重构GUI应用程序时,您遵循哪些模式?
jfp*_*ret 19
永远不要从JDialog,JFrame或JInternalFrame派生来定义表单,对话框......
而是来自JPanel.这将带给您以下优势:
Pau*_*lin 15
使用布局管理器.您可能认为现在使用硬编码位置定位所有内容更简单(特别是如果您使用图形布局工具),但是当需要更新gui或将其国际化时,您的继任者会讨厌您.(相信我,我是那个从一开始就使用布局管理器的人,以及那个不理我的人的继任者.)
Mar*_*rko 14
避免使用GUI布局设计器(构建器).稍后它将使您的代码更清晰,更易于维护.
这是一个关于GUI代表什么的更抽象的高级答案,而不是它的机制.
根据您的任务,可能很难做到这一点,因此您的用户可以在概念上掌握GUI正在做什么.我做了一些涉及GUI的非常棘手的工作,我最成功的方法是采用一组复杂的控件并将它们放入用户期望的布局中.
例如,我写了一个系统来管理T1线路两端的两个设备(有点像调制解调器).这些控件真的难以理解 - 像"创建环回,测试远端信号,测试近端位模式,发送各种位模式,......"等字段(这是一个非常过于简单化,它比这更糟糕)
我必须真正了解这个问题,所以我去了一个技术支持代表谁帮助客户解决这个问题所有的时间.他给我看一个图的手册中,走到我通过什么不同的控制做到了图上.
我把该图中,用图形它重新创建的(只是一个简单的画线的大部分,但它显示出两端和它们之间的连接),则图形的然后使用区域来表示的控制和反馈(颜色变化) .您可以直观地看到信号已经消失.当你打开一个环回在远端,你可以看到线环的信号返回到它的输出线,那么你可以看到颜色的变化为您的近端开始得到它被发送出的图案它的其他线路.
"控件"比这更复杂,但GUI将其简化为客户需要了解的问题.
在此之后,我们让客户回到我们面前告诉我们他们以前从来没有能够弄清楚这些东西,但现在他们完全得到了它!
此演示文稿比GUI实现的连接更加重要.
当组合更容易时,避免继承.
例如,我看到很多像这样:
public class CustomerSupportApp extends JFrame {
JList<Customer> customers;
OtherBusinessComponent importantComponent;
etc. etc
}
Run Code Online (Sandbox Code Playgroud)
这是将业务逻辑与表示混合在一起.它只能从困难变为不可能.
更好的是:
public class CustomerSupportApp {
JList<Customer> customers;
OtherBusinessComponent importantComponent;
// The app HAS-A frame but not IS-A frame
JFrame frame;
etc. etc
}
Run Code Online (Sandbox Code Playgroud)
大量使用MVC模式.这是我的意思的一个简单例子:
class Person
{
String firstName;
String lastName;
// and getters and setters...
}
class PersonSwingModel
{
private Person person;
private javax.swing.text.PlainDocument firstName;
private javax.swing.text.PlainDocument lastName;
// and getters and setters...
// Create some method like init() that initializes PlainDocument values
// to attributes in model.
}
class SavePersonAction extends AbstractAction
{
private PersonSwingModel model;
// and getters and setters...
}
class PersonSwingView extends JFrame
{
private PersonSwingModel model;
private javax.swing.JTextField firstName;
private javax.swing.JTextField lastName;
private SavePersonAction savePersonAction; // hook up to JButton/JMenuItem
// and getters and setters...
// Create some method like init() which binds PlainDocument to JTextField
// and Actions to JButtons or JMenuItems
}
Run Code Online (Sandbox Code Playgroud)
我看到有些人不同意扩展JFrame或JPanel.我不.适合我.
另外,使用LayoutManagers.GridBagLayout功能非常强大.如果使用它,请定义一些GridBagConstraints常量(如LABEL_GBC和FIELD_GBC)并继续重用它们.
尽量不要将文本编码到您的应用中.Swing guis可以非常容易地编写为数据驱动,考虑在xml文件中定义GUI(包括组件名称和位置/布局属性).
我研究的系统有很多属性表(只是成堆的控件,一页一页) - 没有数据驱动,几乎不可能维护或国际化.
如果您决定使用GUI构建器,则永远不要修改它输出的代码(如果您可以避免它) - 最好从外部类绑定到GUI.想想如果你必须在没有建造者的情况下做到这一点将会发生什么 - 是否难以移植?不可能?
了解摇摆中的问题 - 只修改AWT线程中的GUI组件,尽快返回AWT线程(如果你需要做超过100毫秒的任何事情,则产生一个新线程),
尽量保持代码干燥 - 使用Swing GUI可能是一个真正的编程挑战 - 同样,数据驱动代码是我发现不能像新JButton("...")那样不断重复代码的唯一方法;
如果您的数据是基于属性表的,请认真考虑创建绑定机制以将控件绑定到您的数据.DRY代码的一个好目标是每个控件的0(ZERO)特定于控件的代码行,以便从数据库到GUI获取一段数据,让用户编辑它并将其返回到数据库.这意味着您应该能够通过不做任何事情来修改数据来添加新控件.
您不应该扩展 JFrame、JDialog、JPanel、JButton、Janything 类(尽管表行为的某些扩展只有在您扩展时才可用)。如果您喜欢自定义组件,可以扩展 JComponent。如果应该实现模型(例如通过扩展抽象模型)、侦听器(例如通过扩展适配器),仅此而已。您通常不需要/必须扩展 Swing 组件,并且最好不要这样做,因为它会使您的代码与超类的实现相关联。
| 归档时间: |
|
| 查看次数: |
22089 次 |
| 最近记录: |