首页 文章

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

提问于
浏览
27

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

现在我的问题:

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

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

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

EDIT: 到现在为止,我很难找到布局错误 . 如果MS的Visual Studio能够创建大致干净的代码,为什么不是其他代码?

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

10 回答

  • 72

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

  • 1

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

    • 在触摸键盘之前,在纸上绘制GUI元素 . 就像用于视频制作的经典故事板一样 . 如果您有客户,请使用手绘(!)设计来传达这些想法(..只是阅读,您已经计划在纸上)

    • 计划实现模型 - 视图 - 控制器(MVC)或模型 - 视图 - 展示器模式

    • Databinding是一个值得考虑的好技术 . 它保证了模型(数据)和视图(GUI)之间的同步,并提供输入验证,动态转换和更多有用的东西(提供了JFace数据绑定的链接,但我敢肯定,还有其他框架用于Swing / AWT以及)

  • 1

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

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

    • 为每个面板(或"top-level"组件)实现添加 main 方法,允许其他开发人员轻松确定组件的外观 .

    • 赞成在 ActionListener 上使用 Action s并在每个 JComponentActionMap 中注册这些操作 . 这允许它们被"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 类,而是使用 ChangeListenerPropertyChangeListener 或您自己的自定义侦听器实现来传播事件 . Observer 传递一个 Object 作为它的事件,强制客户端代码使用instanceof检查类型并执行向下转换,使代码不可读并使类之间的关系不那么清晰 .

    • 赞成使用 JTable 而不是 JList ,即使在您的表只有一列的情况下也是如此 . JList 在其API中有一些讨厌的功能,包括你需要提供一个原型值来正确计算它的大小 .

    • 永远不要使用 DefaultTableModel ,因为它通常会导致您将"model"数据存储在两个位置:在您的实际业务对象中以及 DefaultTableModel 所在的2D数组中 . 相反,只需子类 AbstractTableModel - 它是 very easy 来执行此操作,这意味着您的实现可以简单地委托给存储数据的数据结构(例如 List ) .

  • 1

    我'm one of those archaic dudes who do GUI layout by hand. I'米也不怕臭名昭着的 GridBagLayout

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

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

    这主要是它 . 适合我 .

  • 2

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

    另外,这些年来我用过的另一个小技巧当试图调试布局或“我真正看到哪个面板”问题时,效果很好的是给每个“容器”面板一个非常扎实的背景颜色(黄色,蓝色等) . 显而易见的东西,即使它只有一个像素宽,你也会看到它 .

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

  • 0

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

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

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

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

  • 5

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

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

  • 1

    我自己用

    Pencil

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

  • 0

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

    此致,Sameer

  • 1

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

相关问题