有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

swing JAVA JScrollPane未显示

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

  1. # 1 楼答案

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

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

    要解决此问题,请明确指定组件的首选尺寸,如果使用BorderLayout将组件添加到非中心面板部分,这些组件可能会无限增长:

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

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

  2. # 2 楼答案

    你的问题似乎在于你的布局经理。我认为当你不使用BorderLayout时,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));
    

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