【发布时间】:2010-01-01 20:15:14
【问题描述】:
我目前正在编写一个具有 SWT GUI 的应用程序,但希望最终用户能够在 SWT 和 Swing 之间进行选择。我之前在程序的不同层尝试过抽象 GUI 细节,但从未对结果真正满意。有没有达成一致或好的方法来做到这一点?
【问题讨论】:
标签: java user-interface swing swt
我目前正在编写一个具有 SWT GUI 的应用程序,但希望最终用户能够在 SWT 和 Swing 之间进行选择。我之前在程序的不同层尝试过抽象 GUI 细节,但从未对结果真正满意。有没有达成一致或好的方法来做到这一点?
【问题讨论】:
标签: java user-interface swing swt
不幸的是,我不相信有与工具包无关的 API 或类似的。
所以也许值得看看model-view-controller 模式。您需要将尽可能多的功能从 GUI 抽象到控制器中,以便 GUI 组件很薄,并且专用于您选择的特定窗口工具包。
这将允许您以最少的重复代码插入 Swing 视图来代替 GWT 视图(反之亦然)。
还请注意,这使得测试一个很多变得更容易,因为尽可能多地被折叠到控制器或模型中。
【讨论】:
如果您的唯一目标是让用户在 SWT 或 Swing 之间选择绘制他们的 UI,那么SWTSwing 将是一个选择。您可以在 SWT 中编码并在启动期间选择 SWT 实现 jar,并相应地调整您的类路径。
SWTSwing 是使用 Swing 实现的 SWT API。它与每个本机 SWT 实现所做的事情相同:它提供了通往底层 GUI API 的桥梁。
为什么我写“本来”?不幸的是,该项目似乎已经死了,陷入了未完成的 SWT-3.2 实现中,尽管正如您在 webstart 演示中看到的那样,许多工作似乎已经完成。姊妹项目EoS(Eclipse on Swing)甚至有一个正在运行的原型。所以我不能真正推荐使用它,即使我喜欢这个想法。
【讨论】:
是否有一种公认的或好的方法来抽象出特定于 GUI 的代码?
简而言之,答案是否定的。
使用任何特定 GUI 库的麻烦在于,每个 GUI 都带有一组基本设计原则,这些原则会影响库的每次使用。除非遇到两个这样的库,它们在这些设计原则的每一个细节上都达成一致,否则不会简单地用一个 GUI 替换另一个。
有许多库试图将他们的设计强加在每个具有自己设计的不同 GUI 上,但这些库需要大量的编程。同样,将一套设计范式强加到另一套设计范式的尝试通常不会完全成功。
这些库的示例是 QT、wxWidgets,当然还有 Java 的基础 AWT。
最后,您几乎必须接受您将选择一个库并坚持下去。
【讨论】:
是的,使用SwingWT,使用 SWT 作为后端的 Swing 实现。
许多人更喜欢更高级别的 Swing API,但 SWT 使用本机小部件。这个库显然给了你两个。
它还允许 Swing 应用程序使用 SWT 后端不加修改地运行(因为您的程序已经使用 SWT 编写,这对您没有帮助,但它会帮助其他人)。根据描述,该实现使用自定义类加载器工作,该类加载器将 Swing 调用替换为对 SwingWT 的调用。应该可以让用户选择是否这样做。
作者似乎没有积极开发它,但他仍在审查/应用从其他人那里收到的补丁(最近一次是在 2012 年初)。
【讨论】: