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

时间:2011-01-10 20:05:13

标签: java refactoring swt awt

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

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

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

4 个答案:

答案 0 :(得分:3)

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

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

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

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

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

<强>加成

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

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

2011年4月6日更新:

我们现在重构我们的Swing应用程序以始终使用其父级创建组件(如在SWT中)。我们对JFrameJDialog的子类进行了重构,只是拥有 JDialog实例,以便更轻松地切换到SWT的Shell。与此同时,我们在SWT中重写了复杂的组件。