[英]Java AWT/SWT/Swing: How to plan a GUI?
我已经用一个小的图形用户界面实现了一些应用程序。 没有什么复杂的,但我遇到了几个问题,组件没有显示或只是没有按预期运行。
现在我的问题:
你如何规划这些用户界面? 当你需要做出改变时你会怎么做? 你如何调试奇怪的行为?!
这适用于几乎所有类型的gui设计。 当然,使用Microsofts Visual Studio,你有一个很大的优势,因为你几乎得到了你在设计师看到的东西。
是否存在针对AWT的优秀开源(或免费软件)设计器? 已经环顾四周,没有找到真正聪明的东西。
编辑:到现在为止,我还手工创建了所有的GUI。 当然它是更清晰的代码,但有时很难找到布局错误。 如果MS的Visual Studio能够创建大致干净的代码,为什么不是其他代码?
我听说过一些Eclipse Visual设计师。 这个已经准备就绪吗?
我不是GUI构建器的忠实粉丝:它们通常会自动生成桶装代码,然后锁定整个开发团队使用一个IDE。 此外,此代码通常是不可读的(检查在Netbeans下使用Matisse时生成的代码)。
我对GUI设计/调试的建议是:
main
方法,允许其他开发人员轻松确定组件的外观。 ActionListener
使用Action
,并在每个JComponent
的ActionMap
注册这些操作。 这允许它们被“提取”并添加到UI的其他部分(例如JToolBar
),同时仍然由“拥有” JComponent
控制它们的状态(即松散耦合)。 assert SwingUtilities.isEventDispatchThread()
。 TaskManager
类。 任何后台处理(在SwingWorker
执行)都会传递给TaskManager
创建的Task
的句柄。 与Task setThrowable(Throwable)
(通过调用setDescription(String)
, setThrowable(Throwable)
, cancel()
)会导致状态栏更新。 它还会使玻璃窗格显示为“全局”任务......但这些都与各个SwingWorkers分离/隐藏。 Observer
/ Observable
类,而是使用ChangeListener
, PropertyChangeListener
或您自己的自定义侦听器实现来传播事件。 Observer
传递一个Object
作为它的事件,强制客户端代码使用instanceof检查类型并执行向下转换,使代码不可读并使类之间的关系不那么清晰。 JList
使用JTable
,即使在表只有一列的情况下也是如此。 JList
在其API中有一些讨厌的功能,包括你需要为它提供一个原型值来正确计算它的大小。 DefaultTableModel
因为它通常会导致您将“模型”数据存储在两个位置:在您的实际业务对象中以及DefaultTableModel
所在的2D数组中。 相反,只需简单地继承AbstractTableModel
- 这很容易实现,这意味着您的实现可以简单地委托给存储数据的数据结构(例如List
)。 我是那些手工制作GUI布局的古老家伙之一。 我也不怕臭名昭着的GridBagLayout
!
多年前,我通过模拟Visual Age使用的编码标准为自己保持简单:我使用了大量的JPanel来组织GUI的各个部分,每个人都有自己的makeXXX()
方法来创建它,将它布局,将其返回到父面板或构造函数。 这样,每个makeXXX
只需要专注于整个作品的一小部分。
某些组件需要通过各种实例方法访问; 我将这些声明为实例字段。 其他东西,只是装饰或布局,不需要在makeXXX
方法之外暴露。
这主要是它。 适合我。
手工做。 除非你在C#中使用“部分类”概念,否则GUI构建器并不好,即便如此,它们通常会导致比解决更多的问题。 使用GUI构建器工具制作原型 - 确保,但不能用于生产代码。
此外,我多年来使用的另一个小技巧,在尝试调试布局或“我真正看到这个面板”问题时效果很好,就是给每个“容器”面板一个非常华丽的背景颜色(黄色,蓝色等等) )。 显而易见的东西,即使它只有一个像素宽,你也会看到它。
我最喜欢的简单对话框布局是BoxLayout。 它不是很好,你必须编写很多样板,但至少它通常会以你期望它的方式工作。 在必要之前,不要过度思考布局。
Eclipse的视觉GUI设计暂时已经死了(但现在显然至少有一半) 插件 ,Netbeans仍然支持它。 但是,由此产生的代码不是很好。 至少对于之后不得不使用该代码库的人来说,这是非常痛苦的。
至于我,我倾向于预先在纸上进行计划,并尝试在第一次尝试时将所有面板的嵌套与其布局相连。 根据我的经验,Java GUI代码本质上是只写的。
上次我做了这样的事情,我首先创建了我需要的每一个控件,然后将它拼凑在一起,形成多个面板和布局等等。这种方式至少可以管理,并且在必须进行更改时没有太多的痛苦。
我倾向于不要过多考虑Winforms和WPF中的特定布局,因为正如您所指出的那样,强大的设计师支持。 即使在XAML中,WPF也很容易处理。 Ans部分类使用部分设计器生成的和部分手写的代码非常愉快。 唉,Java世界没有这样的东西。
NetBeans可能是以所见即所得的方式构建GUI的最佳选择,但许多Java开发人员手工编写GUI,因为它并不困难。 关心边框的厚度和控件之间的间隙,你可以:)
除了工具讨论,还有一些想法和想法
我使用JFormDesigner进行gui生成。 它生成了很好的干净java代码,我通过阅读生成的代码学到了一些东西。 使本地化变得轻而易举。
这是一种非常快速的方法,可以将相关的布局,特别是复杂的菜单栏和网格布局组合在一起。
我建议你在AWT / SWING中使用netbeans进行GUI开发。
此致,Sameer
虽然NetBeans的马蒂斯编辑器很方便,但它产生的代码相当深奥,布局很脆弱。 因此,我一直在利用NetBeans进行WYSIWYG原型设计,然后手动重新编码整个事物。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.