【问题标题】:Converting an AWT application to SWT/JFace将 AWT 应用程序转换为 SWT/JFace
【发布时间】:2011-04-07 02:36:53
【问题描述】:

我目前正在考虑将一个中小型项目从 AWT 转换为 SWT,尽管 Swing 还没有完全退出。 我正在考虑将主窗口转换为 SWT_AWT 桥对象,但我不知道这个语义是如何工作的。之后,我计划为对话更新对话,但不一定在一个版本中。这可能吗?

有人做过这样的转换并且可以给我一些提示吗?那里甚至可能有教程吗?甚至有没有一种工具可以自动化其中的一部分?我试过谷歌搜索,但无济于事。

更新:另外一件事是:目前,这是一个 netbeans 项目。有没有帮助,我不知道。

【问题讨论】:

  • Netbeans 项目:您的意思是:您使用 Netbeans 作为平台还是作为 IDE?
  • “主窗口,一个从 JFrame 派生的对象”我不想这么说,但 javax.swing.JFrame 不是 AWT 类...
  • 感谢 Bemrose,我对两个项目感到困惑。

标签: java refactoring swt awt


【解决方案1】:

我们已经这样做了好几次了。 但这只是因为我们要从 Swing 应用程序转变为 Eclipse RCP 应用程序,而不是因为我们喜欢搞事情。这个项目将真正让您知道您是否已将控制器/模型代码与视图代码分开。

一个建议是不要尝试一次性转换所有内容。你最终会得到一堆根本不起作用的混合代码。您可以从转换门户开始。我会考虑选项卡、对话框或窗口中的任何门户,基本上是独立的单元。如果您有一个打开的窗口,请在 SWT 中创建该窗口,但使其内容成为现有的 AWT/Swing。这应该是相当直截了当的,并且可以让您习惯(我真的希望他们没有喝醉并且有充分的理由这样做)实例化和关联父/子控件的方式。

可能发生的一个问题是透明组件。 Swing,除了一个“window”类之外,都是用Java渲染的。这使得以您想要的方式渲染事物变得非常容易。在 SWT 中,有一些限制:

  • 边界。如果你使用 SWT.BORDER,你会被原生组件使用的任何颜色所困扰。如果您希望边框具有不同的样式或颜色,最好的办法是使用 PaintListener 并渲染您自己的边框。
  • 透明标签、进度条。我无法让标签或进度条具有透明背景。如果您希望它们采用父颜色或绘图,您需要自己渲染文本和其他控件。
  • 控制。 SWT 中有组合和控件。将控件视为执行所有本机 API 调用的基本本机控件。这些不能被子类化,这使得事情变得困难。
  • 表格会给您带来最大的麻烦。在尝试将 JTable 转换为 Table 或 TableViewer 之前,请确保一切稳定。您将在这些方面花费一些时间,尤其是在您有自定义编辑器和查看器的情况下。

我没有研究过为什么 SWT 是这样设计的。我猜有一个很好的理由。如果有人有博客或为它的设计辩护,那就太好了,这样我就不必搜索它了。一旦发布,我将删除这些行,因为它们与问题无关。

加法

我想补充一点,因为您有一个我认为可以工作的现有产品。我能给你的最好的建议是永远不要让你的代码进入无法编译和运行的状态。如果您进行转换并且您签入的任何内容始终运行和执行(尽管 SWT/AWT/Swing 之间存在视觉差异),从长远来看,您将为自己省去很多麻烦。您能做的最糟糕的事情是尝试一次解决所有问题,并让您的代码一次处于不稳定状态数周。

【讨论】:

    【解决方案2】:

    我建议将其导入WindowBuilder 项目,因为 WindowBuilder 使您能够解析现有代码并创建 GUI 模型,然后将组件变形为 SWT 或 Swing。

    【讨论】:

      【解决方案3】:

      如果您想在同一个应用程序中混合使用 SWT 和 Swing,this Eclipse Corner Article 将非常有用。

      【讨论】:

        【解决方案4】:

        我们正在准备相同的步骤:Swing 到 SWT/JFace。首先我们尝试确定瓶颈:用 SWT/JFace 重新实现源自JComponent 的特殊组件,寻找 JIDE 对接的替代品(我们希望使用 SWT/JFace,而不是 RCP,以避免太多麻烦)。我们已经想象到的最糟糕的事情是,在 Swing 中您可以创建组件并稍后将其添加到父级。使用 SWT 这是不可能的:父组件必须作为对子组件构造函数的引用传递。这需要在使用 SWT 之前对 Swing 应用程序进行重大重构。

        坦率地说,我们认为转换是一个非常重大的变化,因为我们预计没有任何东西可以编译的时间会很长。我们试图通过尽可能做好一切准备来减少这个时间,但我们会看看它会有多好。

        2011 年 4 月 6 日更新:

        我们现在重构了我们的 Swing 应用程序以始终使用它们的父级创建组件(就像在 SWT 中一样)。我们的JFrameJDialog 的子类被重构为拥有一个JDialog 实例,以便更容易切换到SWT 的Shell。同时,我们用 SWT 重写复杂的组件。

        【讨论】:

        • 您的代码应该始终编译。永远,永远不要让您的代码进入开发人员无法检查并编译它并成功运行的状态。请相信我并考虑一下。
        • 是的,通常我们是这样开发的,但是这么大的变化怎么办呢?我想,在一个重要的应用程序中,不可能逐步将 Swing/AWT 替换为 SWT/JFace。
        猜你喜欢
        • 1970-01-01
        • 2021-12-22
        • 2013-10-15
        • 1970-01-01
        • 2012-11-07
        • 1970-01-01
        • 2015-11-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多