7

NetBeans GUI エディタを使用してアプリケーションを作成しています。このアプリケーションではJSplitPane、上部のコンポーネントがCanvas内にJScrollPaneあり、下部のコンポーネントがJTextArea、またはそのようなものになります。

ディバイダーを下に引っ張ると、上部のコンポーネントのサイズが大きくなり、すべてがうまくサイズ変更されたように見えます。

仕切りを上に押し上げようとすると、問題が発生します。仕切りが下にあるようですCanvas(そして、下にもある可能性がありJScrollPaneます)。

と の優先/最小/最大サイズのさまざまな組み合わせを試しましたがJScrollPaneCanvas何も機能しないようです。

これは、Netbeans が生成したコードの一部であり、当面の問題に関係している可能性があります。

jSplitPane1 = new javax.swing.JSplitPane();
jScrollPane1 = new javax.swing.JScrollPane();
canvas1 = new java.awt.Canvas();
jTextField1 = new javax.swing.JTextField();

jSplitPane1.setDividerLocation(300);
jSplitPane1.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT);

jScrollPane1.setViewportView(canvas1);

jSplitPane1.setTopComponent(jScrollPane1);

jTextField1.setText("jTextField1");
jSplitPane1.setRightComponent(jTextField1);

これは私の最初の質問なので、質問に画像を埋め込むことは許可されていないため、リンクを投稿します。

赤い矢印は仕切りの位置を示します。

お時間をいただきありがとうございます。

4

3 に答える 3

9

の代わりにsetPreferredSize()、コンポーネントに独自の優先サイズと収容pack()する囲みを計算させます。Window以下の例では、 のインスタンスをdraw.GraphPanel上部に追加し、対応するコントロール パネルを下部に追加します。

画像

import draw.GraphPanel;
import java.awt.EventQueue;
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;

/**
 * @see https://stackoverflow.com/q/11942961/230513
 */
public class SplitGraph extends JPanel {

    public SplitGraph() {
        super(new GridLayout());
        JSplitPane split = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
        GraphPanel graphPanel = new GraphPanel();
        split.setTopComponent(new JScrollPane(graphPanel));
        split.setBottomComponent(graphPanel.getControlPanel());
        this.add(split);
    }

    private void display() {
        JFrame f = new JFrame("SplitGraph");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(this);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new SplitGraph().display();
            }
        });
    }
}
于 2012-08-14T00:39:18.213 に答える
4

コメントで述べたように、AWT と Swing コンポーネントを混在させるべきではありません。コンポーネントを正しい方法で使用していないと思います。JSplitPane の使用方法の簡単な例です。

import java.awt.*; // it is necessary to use the Dimension and BorderLayout classes
import javax.swing.*;

public class Foo extends JFrame {

    public Foo() {

        setTitle( "Splits" );
        setDefaultCloseOperation( EXIT_ON_CLOSE );
        setSize( 400, 400 );

        JSplitPane split = new JSplitPane( JSplitPane.VERTICAL_SPLIT );
        split.setDividerLocation( 200 );
        add( split );

        JPanel panel1 = new JPanel();
        panel1.setLayout( new BorderLayout() );
        panel1.add( new JLabel( "top panel" ), BorderLayout.NORTH );

        JPanel myDrawPanel = new JPanel();
        myDrawPanel.setPreferredSize( new Dimension( 100, 100 ) );
        myDrawPanel.add( new JLabel( "draw panel here!" ) );
        panel1.add( new JScrollPane( myDrawPanel ), BorderLayout.CENTER );

        split.setTopComponent( panel1 );


        JPanel panel2 = new JPanel();
        panel2.add( new JLabel( "bottom panel" ) );
        split.setBottomComponent( panel2 );


        setVisible( true );

    }

    public static void main( String[] args ) {
        new Foo();
    }

}
于 2012-08-13T22:21:53.753 に答える
3

davidbuzatto のコメントを読んだ後、私は AWT と Swing コンポーネントの混合についてグーグルで検索しましたが、それが非常に悪い習慣であることがわかり、少し驚きました。

ここで私の質問に対する最も正確な答えを見つけました

重量コンポーネントには独自の Z 順序があります。これが、Swing と AWT を 1 つのコンテナーで組み合わせることができない理由です。そうである場合、AWT コンポーネントは Swing コンポーネントの TOP に描画されます。

例: AWT コンポーネントが JtabbedPane で使用されている場合、タブが切り替えられてもそれらは消えません。

道を教えてくれてありがとうdavidbuzatto :-)

于 2012-08-14T08:47:07.023 に答える