7

我正在使用 NetBeans GUI 编辑器创建一个应用程序,我希望在其中拥有一个JSplitPane,其顶部组件将是 aCanvas内的 a JScrollPane,底部组件将是 a 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 的评论后,我在 Google 上搜索了有关混合 AWT 和 Swing 组件的信息,我有点惊讶地发现这是一种糟糕的做法。

我在这里找到了对我的问题最准确的答案

重量级组件有自己的 Z 顺序。这就是为什么 Swing 和 AWT 不能组合在一个容器中的原因。如果是,则 AWT 组件将绘制在 Swing 组件的 TOP 上。

例如:当 AWT 组件与 JtabbedPane 一起使用时,它们不会在切换选项卡时消失。

感谢 davidbuzatto 给我指路 :-)

于 2012-08-14T08:47:07.023 回答