[英]JAVA JScrollPane not showing up
我有一个带有滚动条的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);
}
}
您的问题似乎在于布局经理。 我认为,当您不使用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));
这似乎给了我您想要的功能。 让我知道这是否可以解决您的问题!
正如已经建议的那样,您可能应该使用JList
或JTable
来实现您的用例。
关于此问题,这是因为除CENTER
以外,所有BorderLayout
约束都会扩展到其组件占用的空间,即使这意味着它们将扩展到屏幕边界之外(在您的情况下, NORTH
部分在每次扩展后都向南扩展)按钮)。
要解决此问题,请明确指定组件的首选大小,如果您使用BorderLayout
将它们添加到非中央面板部分中,则组件可以无限增长:
scroll.setPreferredSize(new Dimension(-1, 100));
我在此处使用-1
表示width
,这并不重要(我可以使用任何其他值),因为布局管理器无论如何都会忽略它(使用BorderLayout.NORTH
该组件将水平拉伸以获取所有可用的水平空间)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.