【问题标题】:Resizing issue with canvas within jscrollpane within jsplitpane在 jsplitpane 中的 jscrollpane 中调整画布的大小问题
【发布时间】:2012-08-10 04:38:29
【问题描述】:

我正在使用 NetBeans GUI 编辑器创建一个应用程序,我希望在其中有一个 JSplitPane,其顶部组件将是 Canvas 内的 JScrollPane,底部组件将是 @ 987654325@,或者类似的。

当我将分隔线拉下并因此增加顶部组件的大小时,一切似乎都可以调整大小。

当我试图向上推动分隔线时出现问题: 分隔线似乎位于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);

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

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

提前感谢您的宝贵时间。

【问题讨论】:

  • 为什么使用java.awt.Canvas而不是javax.swing.JPanel
  • 因为我是 Swing 的新手,而 canvas 似乎适合我的目的,即在其上绘制形状。我也会看看 JPanel,看看它是否满足我的需求。
  • 它将满足您的需求,并且是最佳选择,因为混合 AWT 和 Swing 组件并不好。应避免使用 AWT 组件。我真的不知道该怎么回答,因为我不明白你想做什么。
  • 问题是画布会变大,但如果我想再变小,它不会调整大小。

标签: java swing jscrollpane jsplitpane


【解决方案1】:

正如我在 cmets 中所说,您不应该混合使用 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】:

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

    【讨论】:

    • 顺便说一句,不要让 GUI 设计师支配你的设计。
    • 那个 GraphPanel 类看起来很有趣。感谢分享:)
    【解决方案3】:

    在阅读了 davidbuzatto 的评论后,我在 Google 上搜索了有关混合 AWT 和 Swing 组件的信息,我有点惊讶地发现这是一种糟糕的做法。

    我找到了我的问题的最准确答案here

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

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

    感谢 davidbuzatto 给我指路 :-)

    【讨论】:

      猜你喜欢
      • 2013-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-03
      • 1970-01-01
      • 2018-02-06
      • 1970-01-01
      相关资源
      最近更新 更多