代码之家  ›  专栏  ›  技术社区  ›  Atmocreations

JavaAWT/SWT/Swing:如何规划GUI?

  •  27
  • Atmocreations  · 技术社区  · 15 年前

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

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

    这几乎适用于所有类型的gui设计。当然,使用MicrosoftsVisualStudio,您有一个很大的优势,因为您几乎可以在设计器中看到什么。

    做一个

    到目前为止,我还手工创建了所有GUI。当然,这是更干净的代码,但有时很难找到布局错误。如果微软的VisualStudio能够创建大致干净的代码,为什么其他人不能呢?

    我听说过一些Eclipse视觉设计师。那个已经准备好生产了吗?

    10 回复  |  直到 7 年前
        1
  •  74
  •   Adamski    13 年前

    我不太喜欢GUI构建器:它们通常会自动生成大量代码,然后将整个开发团队锁定为使用一个IDE。此外,此代码通常不可读(请检查在Netbeans下使用Matisse时生成的代码)。

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

    • 添加 main
    • 赞成使用 Action ActionListener JComponent ActionMap . 这允许将它们“提取”并添加到UI的其他部分(例如。 JToolBar )而他们的国家仍由“拥有者”控制 JComponent
    • 使用assert确保所有UI组件修改都发生在事件分派线程上;例如 assert SwingUtilities.isEventDispatchThread() .
    • 集中捕获和报告工作流事件和异常。例如,我通常实现一个 TaskManager 类,该类已在我的UI的状态栏中注册。任何后台处理(在 SwingWorker s) 将句柄传递给 Task 任务管理器 setDescription(String) setThrowable(Throwable) cancel()
    • 不要使用 Observer / Observable ChangeListener , PropertyChangeListener 观察者 Object 作为事件,强制客户端代码使用instanceof检查类型并执行向下转换,使代码不可读,并使类之间的关系不那么清晰。
    • JTable 结束 JList 列表框 它的API中有一些令人讨厌的特性,包括您需要为它提供原型值才能正确计算其大小。
    • 从不使用 DefaultTableModel 因为它通常会导致您将“模型”数据存储在两个位置:在实际业务对象中,以及存储在二维阵列中 DefaultTableModel AbstractTableModel -它是 很容易 要做到这一点,意味着您的实现可以简单地委托给数据结构(例如。 List
        2
  •  5
  •   Carl Smotricz    15 年前

    我是那种用手做GUI布局的古董。我也不怕臭名昭著的 GridBagLayout !

    makeXXX() 方法来创建它、布局它并将其返回到父面板或构造函数。这样,每个人 makeXXX

    makeXXX 方法。

    基本上就是这样。对我有用。

        3
  •  2
  •   M1EK    15 年前

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

    此外,我多年来在调试布局或“我在这里真正看到的是哪个面板”问题时使用的另一个小技巧是给每个“容器”面板一个非常华丽的背景色(黄色、蓝色等)。一些足够明显的东西,即使只有一个像素宽,你也能看到。

        4
  •  1
  •   Dmitry    15 年前

    NetBeans可能是以WYSIWYG方式构建GUI的最佳选择,但许多java开发人员手工编写GUI,因为这并不难。关心边界的厚度和控件之间的间隙,就可以了:)

        5
  •  1
  •   Andreas Dolk    15 年前

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

    1. 计划实现模型视图控制器(MVC)或模型视图演示器模式
    2. Databinding 是一个需要考虑的伟大技巧。它保证了模型(数据)和视图(GUI)之间的同步,并提供了输入验证、动态转换和更多有用的东西(提供了JFace数据绑定的链接,但我确信,Swing/AWT也有其他框架)
        6
  •  1
  •   Joey Gumbo    15 年前

    曾有一名临时死者(但现在显然至少有一半活着) plugin for Eclipse 对于可视化GUI设计,Netbeans仍然支持它。不过,最终生成的代码还不够出色。至少对于后来不得不使用该代码库的人来说,这是一个相当痛苦的过程。

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

    上一次我做了这样一件事,我首先创建了我需要的每个控件,然后将其拼合到多个面板和布局中,等等。这样至少是可以管理的,并且在必须进行更改时不会有太多的痛苦。

    正如您所指出的,由于强大的设计器支持,我倾向于不太考虑Winforms和WPF中的特定布局。而且,即使在XAML中,WPF也非常容易处理。Ans分部类使使用部分由设计器生成和部分手写的代码变得非常愉快。唉,在Java世界中没有这样的事情。

        7
  •  1
  •   Sam Barnum    15 年前

    我用 JFormDesigner

    这是一种非常快速的方式来组合一个涉及的布局,特别是复杂的菜单栏和网格布局。

        8
  •  1
  •   helpermethod    15 年前

    我自己用

    Pencil

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

        9
  •  0
  •   Samra    15 年前

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

    萨米尔

        10
  •  0
  •   Joonas Pulakka    15 年前

    尽管NetBeans的Matisse编辑器确实很方便,但它生成的代码相当深奥,布局也很脆弱。所以我一直在两全其美,使用NetBeans进行所见即所得的原型设计,然后手工重新编码整个过程。