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