繁体   English   中英

JAVA JScrollPane未显示

[英]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));

这似乎给了我您想要的功能。 让我知道这是否可以解决您的问题!

正如已经建议的那样,您可能应该使用JListJTable来实现您的用例。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM