可滚动面板的Java布局

时间:2013-11-13 15:28:56

标签: java swing layout jpanel jscrollpane

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

喜欢:

enter image description here

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

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);

    }

}

enter image description here

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

2 个答案:

答案 0 :(得分:0)

在BoxLayout中,using invisible components as filler.有不同的方法我不认为你会想要使用“刚性区域”,因为我认为你想拥有可变数量的内部面板。您可能想尝试使用垂直胶水或自定义Box.Filler。

另一种解决方案可能是在您的JFrame和使用BorderLayout的ScrollPane之间放置JPanel,并将滚动窗格放在该面板的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);

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

答案 1 :(得分:0)

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

为什么要将布局设置为BorderLayout?您只能向NORTH添加1个组件。那是你要的吗?阅读Using Layout Managers上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);

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