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

4

我目前在考虑将一个小/中型项目从AWT转换为SWT,但Swing仍未完全排除。我考虑将主窗口转换为SWT_AWT桥接对象,但我不知道这个语义是如何工作的。之后,我计划逐个更新对话框,但不一定在一个版本内完成。这可能吗?

有人做过类似的转换并可以给我一些提示吗?也许有教程可供参考?甚至可能有工具可以自动化部分内容吗?我已经尝试过谷歌搜索,但没有结果。

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


Netbeans项目:您的意思是,您是将Netbeans作为平台还是作为IDE使用? - Mot
主窗口,是从JFrame派生的对象。我不想说,但 javax.swing.JFrame 不是一个AWT类... - Powerlord
谢谢Bemrose,我被两个项目搞混了。 - data
4个回答

3
我们已经做过这个很多次了。但这只是因为我们从Swing应用程序转换为Eclipse RCP应用程序,而不是因为我们喜欢搞事情。这个项目将真正让你知道是否将控制器/模型代码与视图代码分离。
一个建议是不要试图一次性转换所有内容。你最终会得到一堆混合的代码,根本无法工作。您可以开始转换门户。我认为门户是指选项卡、对话框或窗口中的任何内容,实质上是自包含单元。如果您有一个打开的窗口,请在SWT中创建Window,但使其内容为现有的AWT/Swing。这应该是相当简单的,并允许您习惯实例化和关联父/子控件的方式(我真的希望他们没有喝醉酒并且有一个很好的理由)。
可能会出现一个问题,即透明组件。除了“window”类之外,Swing全部以Java方式呈现。这使得按照您想要的方式呈现东西非常容易。在SWT中,存在一些限制:
边框。如果您使用SWT.BORDER,则将固定使用本机组件使用的任何颜色。如果您想使用不同风格或颜色的边框,请使用PaintListener自行渲染。
透明标签、进度条。我无法使标签或进度条具有透明背景。如果您希望它们采用父级颜色或绘图,您需要自己渲染文本和其他控件。
控件。在SWT中有组合和控件。将控件视为执行所有本机API调用的基本本地控件。这些不能被子类化,这使得事情变得困难。
表格会给您带来最麻烦。在尝试将JTable转换为Table或TableViewer之前,请确保一切都稳定。您将花费一些时间在这些上面,特别是如果您有自定义编辑器和查看器。
我没有研究SWT为什么被设计成这样。我猜必须有一个很好的理由。如果有人有关于其设计的博客或辩护,那将是很棒的,这样我就不必搜索了。一旦发布,我将删除这些行,因为它们与问题无关。
补充:
我想补充的是,由于您已经拥有一个现有的产品,我假设它可以工作。我能给你的最好建议是永远不要让你的代码处于无法编译和运行的状态。如果您在转换时始终运行和执行您检查的任何内容(尽管SWT/AWT/Swing之间存在视觉差异),您将在长期内节省许多头痛。最糟糕的事情是试图一次性解决所有问题,并使代码处于不稳定状态数周。

1
我建议将其导入到WindowBuilder项目中,因为WindowBuilder可以解析现有代码并创建GUI模型,然后将组件转化为SWT或Swing。

1

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中重写复杂的组件。


你的代码应该总是可以编译通过。绝对不要让你的代码处于开发者无法检查和编译成功的状态。请相信我并认真考虑这一点。 - Andrew T Finnell
是的,通常我们是这样开发的,但如何应对如此重大的变化呢?我猜,在一个非平凡的应用程序中,逐步用SWT/JFace替换Swing/AWT是不可能的。 - Mot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接