在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
。