可滚动面板的Java布局

可滚动面板的Java布局,java,swing,layout,jpanel,jscrollpane,Java,Swing,Layout,Jpanel,Jscrollpane,我正在尝试创建一个JPanel,它可以调整大小和滚动,并且包含x个更小的内部面板。每个内板的宽度可根据需要而定。但深度应为首选尺寸 比如: 到目前为止,我的代码是: public class TestSize { public static void main(String[] args) { JFrame F = new JFrame(); F.setVisible(true); JPanel P = new JPanel();

我正在尝试创建一个
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);

    }

}


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

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

另一个解决方案可能是在JFrame和使用的ScrollPane之间放置一个JPanel,并将ScrollPane放置在该面板的
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);
你说你希望它可以调整大小,所以我不明白你为什么要设置框架的首选大小。这样,它将刚好适合内部面板

//P.setLayout(new BorderLayout());
为什么要将布局设置为BorderLayout?只能向北部添加一个零部件。这就是你想要的吗?阅读上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);

为什么要将两个面板的背景色设置为相同。您如何判断这两个面板是否已添加?使它们具有不同的颜色以便于查看。

变量应按惯例以小写开头。您遇到了什么问题?这个网站是用来询问具体问题的,而不仅仅是提供一般帮助。@gla3dr:如果你遵循一些基本的惯例,很可能会有人帮助你。@JensPiegsa哦,我不反对你的看法。我还建议他给变量更多的描述性名称,而不是单个字母。@gla3dr:所以,我们同意。曾经,我们也是叛军^^对于1个面板来说,这似乎相当不错。添加:P.add(S,BorderLayout.NORTH);但是当我添加第二个时,我得到了P.add(S2,BorderLayout.NORTH);然后第二个面板将替换第一个…@ManInMoon,这是因为在BorderLayout的每个部分中只能有一个组件。您的每个面板都在各自的滚动窗格中吗?@ManInMoon,那么这个问题与您昨天的问题有什么不同()其中建议您将固定面板添加到北部,将另一个面板添加到中部?@camickr这是关于将多个宽而非深面板添加到滚动窗格中……那么您打算在SSCCE中的何处进行此操作?只需为北部创建一个配电盘,然后向其中添加其他配电盘。然后使用north面板创建一个JScrollPane,并将scrollpane添加到框架的北面。感谢所有的评论,但是如果您先阅读其他人的建议,那就太好了。我想要很多短宽面板(我可以得到我想要的,不是吗?),它们是绿色的,因为这只是一个SCCE!!!!!!如果您能先阅读其他人的建议,那就太好了。我已经看过了,您认为我为什么会在其他答案中发表评论<代码>它们是绿色的,因为这只是一个SCCE-SSCCE仍然有意义。您应该能够判断是否同时显示了两个面板。这是对代码的一行更改。这是一种标准的调试技术。
建议您应该做什么而不是不应该做什么将不胜感激
-我确实给了您应该做的。应该做的和不应该做的结合起来解决这个问题。你有你的答案,你把我弄丢了!我看到的唯一建议是在北部边界增加一个“小组”。您是否建议该面板的行为会有所不同,因为它位于北边界?我建议您阅读布局管理器上的
Swing教程
,以便了解布局管理器的工作原理。使用
BorderLayout
启动,因为这是JFrame的默认布局管理器
您是否建议该面板因位于北部边界而表现不同?
-是。高度将受到尊重,但宽度将有所不同。因此滚动窗格应该添加到框架的北部。添加到框架的面板将包含随宽度变化的其他面板,因此您需要为该面板选择一个布局管理器,以水平显示S、S1和S面板。