4

Swingコンポーネントに変換できないAWTキャンバスがあります(VTKからのものです))。これらのキャンバスのいくつかをJSplitPane内に表示したいと思います。Javaで重いコンポーネントと軽いコンポーネントを混合することについて読んだことがあり、それがお尻の痛みであることを知っていますが、選択の余地はありません。AWTキャンバスをJPanel内にラップし、それを分割ペインに配置すると、分割ペインはまったく機能しません。ただし、AWTキャンバスをJPanel内に配置し、次にJScrollPane内に配置し、次にJSplitPane上のそれらのスクロールペインを配置すると、分割ペインは機能しますが、AWTキャンバスコンポーネントのサイズが適切に変更されません。JSplitPaneの仕切りを移動したときに、AWTキャンバスコンポーネントのサイズを適切に変更する方法がわかりません。その時、仕切りの移動操作をキャッチしてAWTキャンバスで操作することはできますが、どうしたらよいかわかりません。私'

何か案は?

これが問題の例です

import javax.swing.*;
import java.awt.*;

public class SwingAWTError {
    public static void main(String[] args) {
        Canvas leftCanvas = new Canvas();
        Canvas rightCanvas = new Canvas();
        leftCanvas.setBackground(Color.RED);
        rightCanvas.setBackground(Color.BLUE);

        JPanel leftPanel = new JPanel();
        JPanel rightPanel = new JPanel();
        leftPanel.setLayout(new BorderLayout());
        rightPanel.setLayout(new BorderLayout());
        leftPanel.add(leftCanvas, BorderLayout.CENTER);
        rightPanel.add(rightCanvas, BorderLayout.CENTER);

        JScrollPane leftScroll = new JScrollPane();
        JScrollPane rightScroll = new JScrollPane();
        leftScroll.getViewport().add(leftPanel);
        rightScroll.getViewport().add(rightPanel);

        JSplitPane split = new JSplitPane();
        split.setLeftComponent(leftScroll);
        split.setRightComponent(rightScroll);
        split.setDividerLocation(400);

        JFrame frame = new JFrame();
        frame.getContentPane().setLayout(new BorderLayout());
        frame.getContentPane().add(split, BorderLayout.CENTER);
        frame.setSize(800, 800);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}
4

2 に答える 2

4

それは汚い方法ですが、これはそれを解決します:

ウィンドウのサイズを変更せずに電話をかけるとpack()、あまり起こりません。したがって、最初にウィンドウのサイズを変更してからを呼び出すpack()と、コンポーネントが正しく描画されます。これは、このダーティメソッドをディバイダー移動リスナーメソッドに入れることができることを意味します。

frame.setPreferredSize(frame.getSize()); // store the current size to restore it after packing.
frame.setSize(frame.getWidth() + 1, frame.getHeight()); // resize it!!
frame.pack();

正確にはわかりませんが、Javaでは奇妙な動作です
...より良い解決策が見つかるまで、これが役立つことを願っています...

于 2010-10-26T15:50:53.770 に答える
2

ここでは運が悪いです。これについては、sun / oracleのWebサイトにかなり良い記事があります:http: //java.sun.com/products/jfc/tsc/articles/mixing/

基本的に、このガイドラインに要約されます(z-orderingの見出しの下にあるそのリンクから取得):

軽量コンポーネントが重量コンポーネントと重なることが予想されるコンテナ内で、軽量(Swing)コンポーネントと重量(AWT)コンポーネントを混合しないでください。

編集:私はそのサイトを閲覧し続け、別のリンクに出くわしました、そして状況がわずかに改善されたように見えます:http: //java.sun.com/developer/technicalArticles/GUI/mixing_components/しかし、あなたのケースは制限セクションの下部にリストされているもの:

制限事項

いくつかの状況はサポートされていません:

* Non-opaque lightweight components that have translucent

ピクセル(0 <アルファ<255)はサポートされていません。部分的に半透明の軽量コンポーネントが重量コンポーネントと重なる場合、重量コンポーネントは透けて見えません。

* Embedded heavyweight components must belong to the process that

フレームまたはアプレットを作成しました。ヘビーウェイトコンポーネントには、アプリケーション(またはアプレット)のメインプロセス内に有効なピアが必要です。

* Advanced Swing key events, such as those events maintained in an

InputMapは、軽量コンポーネントと重量コンポーネントが混在している場合は正しく機能しない可能性があります。既知の回避策はありません。

于 2010-10-26T11:01:45.247 に答える