Swing バージョンから移行中の RCP アプリケーションに取り組んでいます。そのため、この移行中に Swing の世界にまだ存在する必要がある多くの UI コンポーネントがあります。既存の Swing コンポーネントを AWT-SWT ブリッジ フレームに適切に配置できます。
これらの 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
をトリガーするメニュー項目を用意しましたが、問題は解決しませんでした。含まれている部分のレンダラーと関係があると思われますが、対処方法がわかりません。