JScrollPane没有在JSplitPane中显示滚动条

时间:2016-01-29 19:45:31

标签: java swing scrollbar jscrollpane jsplitpane

我有这段代码基本上是一个包含JSplitPane的JFrame,它在左侧包含一个包含JPanel的JScrollPane。我希望看到滚动条,因为JScrollPane中的JPanel比JScrollPane本身更大。为什么滚动条不显示? 如果我用setPreferredSize()替换setSize()然后它可以工作,但我想使用setSize()。有什么办法可以使用setSize()并显示滚动条吗?

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

public class Test {

    public static void main( String[] args ) {
        JFrame frame = new JFrame();
        frame.setLayout( new BorderLayout() );
        JSplitPane splitPane = new JSplitPane();
        frame.add( splitPane, BorderLayout.CENTER );
        JPanel panel = new JPanel();
        panel.setBackground( Color.red );
        panel.setSize( 1920, 1200 );
        //panel.setPreferredSize( new Dimension( 1920, 1200 ) );
        JScrollPane scrollPane = new JScrollPane( panel );
        splitPane.setLeftComponent( scrollPane );
        splitPane.setRightComponent( new JPanel() );
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        frame.pack();
        frame.setVisible( true );
        frame.setSize( 960, 600 );
    }
}

编辑:我添加了修改版本,我使用setPreferredSize()。是否有更好的解决方案来动态改变大小?

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

public class Test {

    public static void main( String[] args ) {
        JFrame frame = new JFrame();
        frame.setLayout( new BorderLayout() );
        JSplitPane splitPane = new JSplitPane();
        frame.add( splitPane, BorderLayout.CENTER );
        final JPanel panel = new JPanel();
        panel.setBackground( Color.red );
        panel.setPreferredSize( new Dimension( 1920, 1200 ) );
        JScrollPane scrollPane = new JScrollPane( panel );
        splitPane.setLeftComponent( scrollPane );
        JButton button = new JButton();
        button.addActionListener( new ActionListener() {

            @Override
            public void actionPerformed( ActionEvent e ) {
                panel.setPreferredSize( new Dimension( 3840, 2400 ) );
                panel.revalidate();
            }
        });
        splitPane.setRightComponent( button );
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        frame.pack();
        frame.setVisible( true );
        frame.setSize( 960, 600 );
    }
}

1 个答案:

答案 0 :(得分:1)

setSize将忽略JSplitPane,因为左/右组件的布局不是null,并且它会尝试使内部组件适合可用空间。

JSplitPane的左/右组件的布局管理器尊重preferredSize属性(而不是size属性),如果它没有设置,它只是尝试在JSplitPane中的左/右区域的可用空间内拟合内部组件。

使用setPreferredSize代替或覆盖面板的getPreferredSize方法,作为评论中描述的 camickr