2017-05-25 6 views
1

私はSwingバージョンから移行中のRCPアプリケーションで作業しています。だから私たちは、この移行中にSwingの世界に住む必要がある多くのUIコンポーネントを持っています。私は、既存のSwingコンポーネントをAWT-SWTブリッジフレームに適切に配置することができます。ブリッジの内容が変更されたときにAWT-SWTブリッジを含むEclipse RCP部分をリフレッシュする

これらのSwingコンポーネントをJScrollableペインにラップしてからブリッジに追加したので、Swing UIエレメントのサイズが変更されたときに収容部品のサイズを変更する必要はありません。

@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コンポーネントは、ユーザーがボタンをクリックすると、コンポーネントの中に隠されたものは目に見える、または新しい作られ振る舞いを持っている:私は一部の古い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; 
} 

スイングコンポーネントの要素が変更されると、親ブリッジフレームが正しくレンダリングされないという問題があります。

部品が最初に作成されている場合は、私のアプリケーションは、次のようになります。私はそのブリッジフレームの中央にテキストラベルを追加することになっていますEastButtonをクリックした後 before

。ただし、はアプリケーションビューで何も変更されません。私も少しの部分は、サッシ含むサイズを変更し始め

しかし、正しくブリッジフレームの更新を含む部分:私はブリッジフレーム更新収容部を作るために何ができるかafter resizing

自動的に更新しますか?

が、これはブリッジフレームに再描画の問題だったかどうかをテストするために、私はブリッジフレームのrepaint/revalidate/packをトリガーするメニュー項目を持っていたが、それは問題を解決していませんでした。私はそれが収容部のレンダリングと何か関係があると考えていますが、それに対処する方法は分かりません。

+0

私はブリッジを使用していないので、推測して 'embed.layout(true、true) 'を試してください。 –

+0

@ greg-449ありがとう!残念ながら、これはうまく動作しませんでした(あるいは、 'layout'、' redraw'などの変形です)。 – anishthecoder

答えて

0

最終的には、ブリッジを含む部分にカスタムControlListener/ComponentListenerを付けて問題を回避しました。ブリッジフレームの動作の中で何らかの変更があっても、それが親を超えてサイズ変更された場合、リスナーは親に収まるようにリサイズして、スクロールペインを引き継ぐようにします。ここで

は私のリスナーです:

public class BridgeComponetAdapter 
     extends ComponentAdapter 
     implements ControlListener { 

    private final Composite parent; 
    private final Frame bridgeFrame; 
    private Point parentSize; 

    public BridgeComponetAdapter(
      final Composite parent, 
      final Frame bridgeFrame) { 
     this.parent = parent; 
     this.bridgeFrame = bridgeFrame; 
     bridgeFrame.addComponentListener(this); 
     parent.addControlListener(this); 
    } 

    @Override 
    public void componentResized(final ComponentEvent e) { 
     System.out.println(e); 
     if (e.getSource() != bridgeFrame) 
      return; 

     final Dimension currentBridgeSize; 
     currentBridgeSize = bridgeFrame.getSize(); 
     if (currentBridgeSize.getWidth() > parentSize.x 
       || currentBridgeSize.getHeight() > parentSize.y) { 
      bridgeFrame.setSize(parentSize.x, parentSize.y); 
     } 
    } 

    @Override 
    public void controlMoved(final ControlEvent e) {} 

    @Override 
    public void controlResized(final ControlEvent e) { 
     System.out.println(e); 
     if (e.getSource() == parent) 
      parentSize = parent.getSize(); 
    } 
} 

それはエレガントな解決策ではありません。私はまだ問題を解決するために他のアイデアを公開しています。

1

同じ問題が純粋なSwingの溶液中に存在する:

public static void main(String[] args) { 
    JFrame bridgeFrame = new JFrame("Test"); 
    bridgeFrame.setSize(400, 400); 
    bridgeFrame.setLayout(new BorderLayout()); 
    bridgeFrame.add(new JScrollPane(getTestPanel()), BorderLayout.CENTER); 

    bridgeFrame.setVisible(true); 
} 

あなたのイベントハンドラでoutput.doLayout()を追加する必要があります。

+0

Swing要素とSWT要素の両方でレイアウト/再描画/再検証アプローチの多くのバリエーションを試してみました。 – anishthecoder

+0

この特定の例に関しては、あなたが正しいです。謝罪;私は、元のアプリケーションを見て応答していました。実際のアプリケーションでは、埋め込みフレーム内で何が起こっているのかをあまり制御できません。だから私は必要に応じて 'doLayout'を呼び出すことができませんでした。また、 'LayoutManager'と何か関係があります。ここの簡単な例では、BorderLayoutは非常にうまく動作します。しかし、私の実際のアプリケーションでは、埋め込みコンポーネントに 'MigLayout'を使用することがよくあります。これは、コンポーネントが内部的に追加されたときと同じように動作しない可能性があります。 – anishthecoder

関連する問題