Java JScrollPane不显示JSplitPane内的滚动条

Java JScrollPane不显示JSplitPane内的滚动条,java,swing,scrollbar,jscrollpane,jsplitpane,Java,Swing,Scrollbar,Jscrollpane,Jsplitpane,我有一段基本上是JFrame的代码,它包含一个JSplitPane,左侧包含一个JScrollPane,其中包含一个JPanel。我希望看到滚动条,因为JScrollPane中的JPanel比JScrollPane本身更大。为什么不显示滚动条? 如果我用setPreferredSize()替换setSize(),那么它可以工作,但我想使用setSize()。是否有任何方法可以使用setSize()并显示滚动条 import java.awt.*; import javax.swing.*; p

我有一段基本上是JFrame的代码,它包含一个JSplitPane,左侧包含一个JScrollPane,其中包含一个JPanel。我希望看到滚动条,因为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 );
    }
}

您的
setSize
将被
JSplitPane
忽略,因为左/右组件的布局不是
null
,它试图在可用空间中安装内部组件

JSplitPane
的左/右组件的布局管理器尊重
preferredSize
属性(而不是
size
属性),如果尚未设置,它只会尝试将内部组件安装在
JSplitPane
中左/右区域的可用空间内


改为使用
setPreferredSize
或将面板的
getPreferredSize
方法覆盖为注释中所述的camickr

向面板添加导致面板大小超出滚动窗格可视区域的内容;覆盖面板的getPreferredSize方法,而不是使用setSize
和setPreferredSize(),那么它可以工作,但我想使用setSize()
为什么要使用不工作的东西?
如果我用setPreferredSize()替换setSize(),那么它可以工作,但我想使用setSize().
-但这不是Swing的工作方式,也不是Swing设计的工作方式。所以不能使用setSize(),因为这对滚动窗格的视口没有任何意义。@FredK我有一个图像(1920x1200),需要在各种缩放下显示。例如,在缩放8x时,图像对于内存来说太大,因此我必须计算可见部分的偏移量,并且当JPanel内的JLabel与图像大小相同时,计算该偏移量更容易。我可以使用setSize()动态更改JPanel的大小,但我认为setPreferredSize()不会动态更改大小。我错了吗?@corneliu:,例如。另请参见。您应该重写getPreferredSize()方法。每个组件都应该负责确定自己的首选大小。好的,我已经更新了我的原始帖子,并添加了另一个版本的代码。我使用revalidate()使其工作。有更好的解决方案吗?我认为根据JSplitPane的文档,每次调用setPreferredSize后,都应该调用
revalidate
方法,因为
setPreferredSize
会使组件的层次结构无效。因此,在
setPreferredSize