JScrollPane 不显示 JSplitPane 内的滚动条
JScrollPane not showing the scroll bars inside a 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 );
}
}
您的 setSize
将被 JSplitPane
忽略,因为 left/right 组件的布局不是 null
,它会尝试将内部组件放入可用 space。
JSplitPane
的 left/right 组件的布局管理器支持 preferredSize
属性(而不是 size
属性)如果尚未设置,它只是尝试将内部组件放入 JSplitPane
.
的 left/right 可用区域 space
改为使用 setPreferredSize
或覆盖面板的 getPreferredSize
方法,如评论中所述 camickr。
我的这段代码基本上是一个包含 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 );
}
}
您的 setSize
将被 JSplitPane
忽略,因为 left/right 组件的布局不是 null
,它会尝试将内部组件放入可用 space。
JSplitPane
的 left/right 组件的布局管理器支持 preferredSize
属性(而不是 size
属性)如果尚未设置,它只是尝试将内部组件放入 JSplitPane
.
改为使用 setPreferredSize
或覆盖面板的 getPreferredSize
方法,如评论中所述 camickr。