JAVA JScrollPane没有出现

时间:2015-07-02 14:01:09

标签: java swing

我有一个带滚动条的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);
}
}

2 个答案:

答案 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)

如前所述,您应该使用JListJTable来实现您的用例。

关于这个问题,这是因为除BorderLayout之外的所有CENTER约束将扩展到其组件占用的空间,即使这意味着它们将扩展到屏幕边界之外(在在每个按钮点击后,NORTH部分向南扩展。

要解决此问题,请明确指定组件的首选大小,如果将这些组件添加到具有BorderLayout的非中央面板部分,则这些组件可无限增长:

scroll.setPreferredSize(new Dimension(-1, 100));

我在-1使用width表示它不重要(我可以使用任何其他值),因为布局管理器无论如何都会忽略它(BorderLayout.NORTH组件被水平拉伸以占用所有可用的水平空间。)