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

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

现在我的问题:

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

这适用于几乎所有类型的gui设计。 当然,借助Microsofts Visual Studio,您可以获得很大的优势,因为您几乎可以获得设计师所看到的内容。

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

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

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

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

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

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

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

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

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

这主要是它。 适合我。

手工做。 除非你在C#中使用“部分类”概念,否则GUI构建器并不好,即使这样,它们通常也会导致比它们解决的问题更多的问题。 使用GUI构建器工具制作原型 – 确保,但不能用于生产代码。

此外,我多年来使用的另一个小技巧,在尝试调试布局或“我真正看到这个面板”问题时效果很好,就是给每个’容器’面板一个非常华丽的背景颜色(黄色,蓝色等等) )。 显而易见的东西,即使它只有一个像素宽,你也会看到它。

我最喜欢的简单对话框布局是BoxLayout。 这不是很好,你必须写很多样板,但至少它通常会按你期望的方式工作。 在必要之前,不要过度思考布局。

NetBeans可能是以所见即所得的方式构建GUI的最佳选择,但许多Java开发人员手工编写GUI,因为它并不困难。 关心边框的厚度和控件之间的间隙,你可以:)

除了工具讨论,还有一些想法和想法

  1. 在触摸键盘之前,在纸上绘制GUI元素。 就像用于video制作的经典故事板一样。 如果您有客户,请使用手绘(!)设计来传达这些想法(..只是阅读,您已经计划在纸上)
  2. 计划实现模型 – 视图 – 控制器(MVC)或模型 – 视图 – 演示者模式
  3. 数据绑定是一种很好的技术。 它保证了模型(数据)和视图(GUI)之间的同步,并提供输入validation,动态转换和更多有用的东西(提供了JFace数据绑定的链接,但我敢肯定,还有其他框架用于Swing / AWT以及)

Eclipse的可视化GUI设计暂时已经死了(但现在显然至少有一半) 插件 ,Netbeans仍然支持它。 但是,由此产生的代码不是很好。 至少对于之后不得不使用该代码库的人来说,这是非常痛苦的。

至于我,我倾向于预先计划在纸上,并尝试在第一次尝试时将所有面板的嵌套与其布局正确。 根据我的经验,Java GUI代码本质上是只写的。

上次我做了这样的事情,我首先创建了我需要的每一个控件,然后将它拼凑在一起,形成多个面板和布局等等。这种方式至少可以管理,并且在必须进行更改时没有太多的痛苦。

我倾向于不要过多考虑Winforms和WPF中的特定布局,因为正如您所指出的那样,强大的设计师支持。 即使在XAML中,WPF也很容易处理。 Ans部分类使用部分设计器生成的和部分手写的代码非常愉快。 唉,Java世界中没有这样的东西。

我使用JFormDesigner进行gui生成。 它生成了很好的干净java代码,我从阅读生成的代码中学到了一些东西。 使本地化变得轻而易举。

这是一个非常快速的方法,可以将相关的布局,特别是复杂的菜单栏和网格布局放在一起。

我自己用

铅笔

首先进行一些原型设计,然后“手动”开始编码(即不使用任何GUI编辑器)。

我建议你在AWT / SWING中使用netbeans进行GUI开发。

此致,Sameer

虽然NetBeans的马蒂斯编辑器很方便,但它产生的代码相当深奥,布局很脆弱。 因此,我一直在利用NetBeans进行WYSIWYG原型设计,然后手动重新编码整个事物,两全其美。