我一直在努力寻找解决问题的方法,但我没有运气。以下是示例代码:
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();
}
});
}
}
快照:
答案 0 :(得分:7)
我总是要像这样设置视口的首选大小。
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();
}
});
}
}
答案 1 :(得分:7)
不要设置任何尺寸!如果进行了此更改,则会显示滚动条。
JPanel panTopCenter = new JPanel(new GridLayout());
基本问题是FlowLayout
将显示以显示它所需的最小尺寸的组件,以及滚动窗格,即(决定为)0x0。通过在构造函数中使用不带参数的GridLayout
并将滚动窗格添加为唯一组件,将强制它填充可用空间。
答案 2 :(得分:3)
如果容器或顶级容器中JScrollPane
为单JComponent
,则必须设置首选大小。
scrollPane.setPreferredSize(new Dimension(100,500));
最好将GridLayout
用于相同类型的JComponent
。
答案 3 :(得分:0)
最好的解决方案,快速而简单,使用SwingX中的JXPanel
,这是准标准并实现Scrollable
。