将AWT应用程序转换为SWT / JFace

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

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

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

我们这样做了很多次。 但这只是因为我们从Swing应用程序转到Eclipse RCP应用程序而不是因为我们喜欢弄乱事物。 该项目将真正让您知道您是否已将控制器/型号代码与视图代码分开。

一个建议是不要尝试同时转换所有内容。 你最终会得到一堆根本不起作用的混合代码。 您可以从转换门户开始。 我会考虑在Tab,Dialog或Window中的任何东西,基本上是自包含单元。 如果您有一个打开的窗口,请在SWT中创建窗口,但将其内容设置为现有的AWT / Swing。 这应该是相当直接的,并允许你习惯(我真的希望他们没有喝醉,并有充分的理由)实例化和关联父/子控件。

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

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

我还没有研究过为什么SWT的设计方式。 我猜这是一个很好的理由。 如果有人有博客或防御它的设计会很好,所以我不必搜索它。 一旦发布,我将删除这些行,因为它们与问题无关。

加成

我想补充一点,因为你有一个现有的产品,我认为是有效的。 我能给你的最好的建议是永远不要让你的代码进入一个无法编译和运行的状态。 如果您正在进行转换,那么无论您在何处运行并执行(尽管SWT / AWT / Swing之间存在视觉差异),您将从长远来看为您节省许多麻烦。 你可以做的最糟糕的事情是尝试同时处理这一切,让你的代码一次处于不稳定的状态数周。

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

如果您正考虑在同一个应用程序中混合使用SWT和Swing,那么这个Eclipse Corner文章将非常有用。

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

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

2011年4月6日更新:

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