我正在开发一个从 Swing 版本过渡的 RCP 应用程序。所以我们有很多 UI 组件在这个过渡期间仍然需要存在于 Swing 世界中。我能够将现有的 Swing 组件正确放置在 AWT-SWT 桥框架中。
在将这些 Swing 组件添加到桥之前,我已将这些 Swing 组件包装在一个 JScrollable 窗格中,这样当 Swing UI 元素的大小发生变化时,我就不必调整包含部分的大小。我在零件中放置旧 Swing 组件的代码如下所示:
@PostConstruct
public void postConstruct(final Composite parent) {
/* Create embedding composite */
final Frame bridgeFrame;
final Composite embed;
embed = new Composite(parent, SWT.EMBEDDED);
embed.setLayout(new FillLayout());
bridgeFrame = SWT_AWT.new_Frame(embed);
bridgeFrame.setLayout(new BorderLayout());
bridgeFrame.add(
new JScrollPane(getTestPanel()),
BorderLayout.CENTER);
}
我的 Swing 组件有这样一种行为:当用户单击按钮时,隐藏在组件中的东西会变得可见,或者新的 UI 元素会添加到 Swing 组件中。例如:
private JPanel getTestPanel() {
final JPanel output;
final JButton eastBttn, westBttn;
output = new JPanel();
eastBttn = new JButton("East Button");
westBttn = new JButton("West Button");
output.setLayout(new BorderLayout());
output.add(eastBttn, BorderLayout.EAST);
output.add(westBttn, BorderLayout.WEST);
eastBttn.addActionListener(evt -> {
System.out.println("East Button Clicked");
output.add(new JLabel("East Button Clicked"), BorderLayout.CENTER);
});
return output;
}
我的问题是,当 Swing 组件中的元素发生变化时,父桥架无法正确呈现。
在我点击后,EastButton
它应该在该桥框架的中心添加一个文本标签。但是,应用程序视图中没有任何变化。
但是,当我开始稍微调整包含部分窗扇的大小时,包含桥架的部分会正确更新:
我该怎么做才能使包含部分更新的桥架更新自动更新?
为了测试这是否是桥架上的重绘问题,我有一个菜单项会触发桥架的 // ,但这并没有解决repaint
问题revalidate
。pack
我怀疑它与包含部分的渲染器有关,但不知道如何解决它。