在JPanel上使用它时,不会出现JScrollPane

我一直在努力寻找解决问题的方法,但我没有运气。 这是一个示例代码:

import java.awt.BorderLayout; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.SwingUtilities; public class Example extends JFrame { private static final long serialVersionUID = 1L; public Example() { JPanel contentPane = (JPanel) getContentPane(); contentPane.setLayout(new BorderLayout()); JPanel panTop = new JPanel(new BorderLayout()); //JPanel panBottom = new JPanel(new BorderLayout()); JPanel panTopCenter = new JPanel(); //JPanel panTopLeft = new JPanel(); //JPanel panTopRight = new JPanel(); panTop.add(panTopCenter, BorderLayout.CENTER); //panTop.add(panTopLeft, BorderLayout.WEST); //panTop.add(panTopRight, BorderLayout.EAST); contentPane.add(panTop, BorderLayout.CENTER); //contentPane.add(panBottom, BorderLayout.SOUTH); JPanel pan = new JPanel(); pan.setLayout(new BoxLayout(pan, BoxLayout.Y_AXIS)); for(int i = 0; i < 50; i++) pan.add(new JButton("Button " + i)); JScrollPane scrollPane = new JScrollPane(pan); panTopCenter.add(scrollPane); pack(); setLocationRelativeTo(null); setVisible(true); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { new Example(); } }); } } 

快照:

在此处输入图像描述

我总是要像这样设置视口的首选大小。

 import java.awt.*; import javax.swing.*; public class Example extends JFrame { public Example() { setDefaultCloseOperation(EXIT_ON_CLOSE); Box box = new Box(BoxLayout.Y_AXIS); for (int i = 0; i < 50; i++) { box.add(new JButton("Button " + i)); } JScrollPane sp = new JScrollPane(box); Dimension d = new Dimension(box.getComponent(0).getPreferredSize()); sp.getVerticalScrollBar().setUnitIncrement(d.height); d.height *= 10; // Show at least 10 buttons sp.getViewport().setPreferredSize(d); add(sp, BorderLayout.CENTER); pack(); setLocationRelativeTo(null); setVisible(true); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { Example e = new Example(); } }); } } 

不要设置任何尺寸! 如果进行了此更改,则会显示滚动条。

 JPanel panTopCenter = new JPanel(new GridLayout()); 

基本问题是FlowLayout将以显示它所需的最小尺寸显示组件,而对于滚动窗格则显示(决定为)0x0。 通过在构造函数中使用不带参数的GridLayout并将滚动窗格添加为唯一组件,将强制它填充可用空间。

如果JScrollPane是容器或顶级容器中的单个JComponent ,则必须设置首选大小。

 scrollPane.setPreferredSize(new Dimension(100,500)); 

更好的方法是将GridLayout用于相同类型的JComponent

最快速,最简单的解决方案是使用SwingX的JXPanel ,它是准标准并实现Scrollable