-1

我正在尝试创建一个JPanel可调整大小和可滚动的并包含 x 个较小的内部面板。每个内面板都可以根据需要/需要宽。但是深度应该是首选尺寸。

喜欢:

在此处输入图像描述

到目前为止,我的代码是:

public class TestSize {

    public static void main(String[] args) {

        JFrame F = new JFrame();
        F.setVisible(true);
        JPanel P = new JPanel();
        P.setLayout(new BorderLayout());
        JScrollPane scrollPane = new JScrollPane(P);
        scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
        scrollPane.setPreferredSize(new Dimension(900,900));//.setBounds(50, 30, 300, 50);

        JPanel S = new JPanel();
        S.setBackground(Color.GREEN);
        S.setPreferredSize(new Dimension(900,200));
            JPanel S2 = new JPanel();
        S2.setBackground(Color.GREEN);
        S2.setPreferredSize(new Dimension(900,200));
            P.add(S,BorderLayout.NORTH);
            P.add(S2,BorderLayout.NORTH);


        F.add(scrollPane);
        F.pack();
        F.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }

}

在此处输入图像描述

但是当我添加了一个内部面板时,它会垂直填充所有空间 - 这不是我想要的:

4

2 回答 2

0
//P.setLayout(new BorderLayout());

为什么将布局设置为 BorderLayout?您只能向 NORTH 添加 1 个组件。那是你要的吗?阅读 Swing 教程中有关使用布局管理器的部分,然后选择更合适的布局管理器。将教程链接添加为书签,因为它提供了 Swing 编程的基础知识。

scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);

为什么要设置这些属性?这些是默认值。

scrollPane.setPreferredSize(new Dimension(900,900));

为什么要将高度设置为 900。您只希望滚动窗格包含高度为 200 的组件?一般来说,您不应该设置首选尺寸。让 frame.pack() 方法完成它的工作。

S.setBackground(Color.GREEN);

为什么要将两个面板的背景颜色设置为相同。你怎么知道这两个面板是否被添加?使它们具有不同的颜色,以便于视觉。

于 2013-11-13T17:56:00.313 回答
0

在 BoxLayout 中,有不同的方法可以使用不可见的组件作为填充物。我认为您不会想要使用“刚性区域”,因为我认为您希望拥有可变数量的内部面板。您可能想尝试使用垂直胶水或自定义 Box.Filler。

另一种解决方案可能是在您的 JFrame 和使用 a 的 ScrollPane 之间放置一个 JPanel BorderLayout,并将滚动窗格放在该BorderLayout.NORTH面板的 中。组件BorderLayout.NORTH水平调整大小,但不会垂直调整大小。本质上,它们只是被推到面板的顶部。

编辑:

我想你会想要这样的东西:

    JFrame F = new JFrame();
    F.setVisible(true);
    F.setLayout(new BorderLayout());
    JPanel P = new JPanel(new BoxLayout(P, BoxLayout.PAGE_AXIS));
    JScrollPane scrollPane = new JScrollPane(P);

    JPanel S = new JPanel();
    S.setBackground(Color.GREEN);
    JPanel S2 = new JPanel();
    S2.setBackground(Color.BLUE);
    P.add(S);
    P.add(S2);

    F.add(scrollPane, BorderLayout.NORTH);
    F.pack();
    F.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

你说你希望它可以调整大小,所以我不明白你为什么要设置框架的首选大小。这样它就适合里面的面板。

于 2013-11-13T16:15:54.983 回答