在jsplitpane中的jscrollpane中调整canvas的问题

时间:2012-08-13 22:00:16

标签: java swing jscrollpane jsplitpane

我正在使用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);

由于这是我的第一个问题,我不允许在问题中嵌入图片,所以我只想发布链接:

红色箭头表示分隔符的位置。

提前感谢您的时间。

3 个答案:

答案 0 :(得分:9)

而不是setPreferredSize(),让您的组件计算自己的首选大小,pack()包含Window以容纳。{}下面的示例在顶部添加了draw.GraphPanel的实例,在底部添加了相应的控制面板。

image

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();
            }
        });
    }
}

答案 1 :(得分: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();
    }

}

答案 2 :(得分:3)

在阅读了davidbuzatto的评论之后,我搜索了关于混合AWT和Swing组件的问题,我有点惊讶地发现这是一个非常糟糕的做法。

我找到了问题here

的最准确答案
  

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

     

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

感谢davidbuzatto向我展示道路: - )