微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将 JPanel带 FlowLayout添加到 JScrollPane

如何解决将 JPanel带 FlowLayout添加到 JScrollPane

我尝试将 JPanel(带有 FlowLayout添加JScrollPane,但 ScrollBar 不起作用。我想将按钮放置为网格,但它是水平放置的。

import javax.swing.*;
import java.awt.*;

public class Test {
    public static void main(String[] args){
        JFrame frame = new JFrame("Test");
        frame.setVisible(true);
        frame.setSize(1000,500);
        frame.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);

        JPanel panel = new JPanel();
        panel.setLayout(new FlowLayout(FlowLayout.LEFT));

        JScrollPane pane = new JScrollPane(panel);
        pane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        pane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
        frame.add(pane);

        for (int i=0;i<100;i++){
            panel.add(new JButton("Label"));
        }
    }
}

enter image description here

enter image description here

解决方法

我想将按钮放置为网格,但它是水平放置的。

那是因为您没有设置 JPanel 的首选大小,并且因为您将 JPanel 添加到 JScrollPane,您有效地赋予了 JPanel 无限宽度和 { {1}} 会将其所有组件布置在一行中,直到达到 FlowLayout 的宽度限制,但由于宽度是无限的,所有 JPanel 都出现在同一行上。此外,由于您将水平滚动条策略设置为 NEVER,因此无法滚动 JButton

您应该在添加所有组件之后调用方法 JPanel
请注意,在下面的代码中,我使用 GridLayout 而不是 setVisible(true),因为 FlowLayout显示 FlowLayout 的网格。另请注意,我调用方法 JButton 而不是方法 pack()

setSize()

这是屏幕截图:

enter image description here

请注意,默认情况下,import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; public class Test { public static void main(String[] args) { JFrame frame = new JFrame("Test"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel panel = new JPanel(); panel.setLayout(new GridLayout(0,10,5,5)); JScrollPane pane = new JScrollPane(panel); pane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); pane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); for (int i=0;i<100;i++){ panel.add(new JButton("Label")); } frame.add(pane); frame.pack(); frame.setVisible(true); } } 将调整自身大小以显示所有 JScrollPane。如果你想让 JButton 只显示几行,那么你需要设置它的首选大小,例如

JScrollPane

编辑

如果您坚持使用 pane.setPreferredSize(new Dimension(710,150)); ,那么您需要为 FlowLayoutJPanel 设置首选大小。

JScrollPane

这是屏幕截图。

another screen capture

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。