Java AWT/SWT/Swing:如何规划GUI?

Atm*_*ons 28 java graphics swing

我已经用一个小的图形用户界面实现了一些应用程序.没有什么复杂的,但我遇到了几个问题,组件没有显示或只是没有按预期运行.

现在我的问题:

你如何规划这些用户界面?当你需要做出改变时你会怎么做?你如何调试奇怪的行为?!

这适用于几乎所有类型的gui设计.当然,使用Microsofts Visual Studio,你有一个很大的优势,因为你几乎得到了你在设计师看到的东西.

是否存在针对AWT 的优秀开源(或免费软件)设计器?已经环顾四周,没有找到真正聪明的东西.

编辑:到现在为止,我还手工创建了所有的GUI.当然它是更清晰的代码,但有时很难找到布局错误.如果MS的Visual Studio能够创建大致干净的代码,为什么不是其他代码?

我听说过一些Eclipse Visual设计师.这个已经准备就绪吗?

Ada*_*ski 73

我不是GUI构建器的忠实粉丝:它们通常会自动生成桶装代码,然后锁定整个开发团队使用一个IDE.此外,此代码通常是不可读的(检查在Netbeans下使用Matisse时生成的代码).

我对GUI设计/调试的建议是:

  • main向每个面板(或"顶级"组件)实现添加方法,允许其他开发人员轻松确定组件的外观.
  • 赞成使用Actions over ActionListeners并将这些操作注册到每个JComponent人的手中ActionMap.这允许它们被"提取"并添加到UI的其他部分(例如JToolBar),同时仍然通过"拥有" JComponent(即松散耦合)控制它们的状态.
  • 使用assert确保在Event Dispatch线程上发生所有UI组件修改; 例如assert SwingUtilities.isEventDispatchThread().
  • 要调试奇怪的布局行为,请考虑用红色绘制组件的背景!
  • 集中捕获和报告工作流事件和异常.例如,我通常实现一个TaskManager在我的UI状态栏中注册的类.任何后台处理(在SwingWorkers中执行)都会传递一个句柄来Task创建一个TaskManager.与工作Interracting(通过调用setDescription(String),setThrowable(Throwable),cancel())导致要更新的状态栏.它还会使玻璃窗格显示为"全局"任务......但这些都与各个SwingWorkers分离/隐藏.
  • 不要使用Observer/ Observable班,而是青睐ChangeListener,PropertyChangeListener或传播事件自己定制的监听器实现. Observer传递一个Object事件,强制客户端代码使用instanceof检查类型并执行向下转换,使代码不可读并使类之间的关系不那么清晰.
  • 即使在您的表只有一列的情况下,也倾向于使用JTableover JList. JList它的API中有一些讨厌的功能,包括你需要为它提供一个原型值来正确计算它的大小.
  • 永远不要使用,DefaultTableModel因为它通常会导致您将"模型"数据存储在两个位置:在您的实际业务对象中以及在所在的2D数组中DefaultTableModel.相反,简单地子类化AbstractTableModel- 这很容易实现,这意味着您的实现可以简单地委托给List存储数据的数据结构(例如).

  • 一切都是这个答案很棒,我只想补充一点.考虑在纸上绘制GUI.使用不同颜色的钢笔/铅笔来指示隐藏的面板,布局管理器,操作等.工程奇妙!你可以在白板上做同样的事,但我更喜欢纸和笔的精确度(加上我们在工作时有各种各样的废料) (10认同)

Car*_*icz 5

我是那些手工制作GUI布局的古老家伙之一.我也不怕臭名昭着GridBagLayout!

我多年前通过模拟Visual Age使用的编码标准为自己保持简单:我使用了很多JPanel来组织GUI的各个部分,每个人都有自己的makeXXX()方法来创建它,将其放置并将其返回给父级面板或构造函数.这样,每个人makeXXX只需要专注于整个作品的一小部分.

某些组件需要通过各种实例方法访问; 我将这些声明为实例字段.其他东西,只是装饰或布局,不需要暴露在makeXXX方法之外.

这主要是它.适合我.

  • 我用MigLayout替换了GridBagLayout(不寒而栗......) - http://www.miglayout.com/ (6认同)
  • GridBagLayout摇滚. (2认同)
  • 我完全同意! (2认同)
  • GridBagLayout杀死了耶稣. (2认同)