我有一个带滚动条的JPanel,我想添加很多JLabel。但滚动条不起作用。我无法使用滚动条,即使面板已满,也不会滚动。这是我的代码:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class Scroll {
public static void main(String[] args) {
JPanel panel = new JPanel(new GridLayout(0,1));
JPanel p = new JPanel(new BorderLayout());
JScrollPane scroll = new JScrollPane(panel);
scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
p.add(scroll, BorderLayout.NORTH);
JButton but = new JButton("OK");
p.add(but, BorderLayout.SOUTH);
but.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
panel.add(new JLabel("Some random text"));
scroll.revalidate();
p.repaint();p.revalidate();
}
});
JFrame frame = new JFrame();
frame.setSize(800,200);
frame.setVisible(true);
frame.add(p);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
}
}
答案 0 :(得分:0)
您的问题似乎与您的布局管理器有关。我认为当你不使用BorderLayout.CENTER位置时,BorderLayout表现得很奇怪。我改变了行
p.add(scroll, BorderLayout.NORTH);
到
p.add(scroll, BorderLayout.CENTER);
然后,为了使文本从顶部显示而不是居中,我将面板组件的布局管理器更改为BoxLayout。从:
JPanel panel = new JPanel(new GridLayout(0, 1));
到
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
这似乎给了我你想要的功能。如果这样可以解决您的问题,请告诉我们!
答案 1 :(得分:0)
如前所述,您应该使用JList
或JTable
来实现您的用例。
关于这个问题,这是因为除BorderLayout
之外的所有CENTER
约束将扩展到其组件占用的空间,即使这意味着它们将扩展到屏幕边界之外(在在每个按钮点击后,NORTH
部分向南扩展。
要解决此问题,请明确指定组件的首选大小,如果将这些组件添加到具有BorderLayout
的非中央面板部分,则这些组件可无限增长:
scroll.setPreferredSize(new Dimension(-1, 100));
我在-1
使用width
表示它不重要(我可以使用任何其他值),因为布局管理器无论如何都会忽略它(BorderLayout.NORTH
组件被水平拉伸以占用所有可用的水平空间。)