JFrame中有多个面板

时间:2014-05-25 13:52:13

标签: java swing jframe jpanel

无用的布局管理器人又回来了,我似乎无法理解这些布局,让它们以我想要的方式工作。

无论如何,我想要一个JFrame,顶部有一个大面板(我称之为标题),它从框架北部框架的左侧到右侧,然后是它下方的四个面板,两个位于标题下方,两个位于标题之下,最后是一个“页脚”面板,与标题面板基本相同,仅在框架的南部。

像这样:

UI Design.

我有四个中间面板工作正常的代码,但是标题面板搞砸了所有内容,我已经测试了GridBagLayout,GridLayout和BoxLayout的演示布局管理器代码。我无法按照自己的意愿去工作。

为了在这里了解你,你可能会注意到我已经有一个与此相关的问题,如果不允许有两个类似的问题,请告诉我,我会将此移至我之前的问题,这可以关闭。

public Shop() {
        shopUI = new JFrame("Shop Menu");
        shopUI.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        shopUI.setBounds(100, 100, 700, 500);
        shopUI.setResizable(false);

        allPanels = new JPanel();

        headerPanel = new JPanel();
        headerPanel.setLayout(new BorderLayout());
        headerPanel.setBackground(Color.cyan);

        mainPanel = new JPanel();
        mainPanel.setLayout(new GridLayout(2,2));

        topLeft = new JPanel();
        topLeft.setBackground(Color.pink);

        topRight = new JPanel();
        topRight.setBackground(Color.black);

        bottomLeft = new JPanel();
        bottomLeft.setBackground(Color.green);

        bottomRight = new JPanel();
        bottomRight.setBackground(Color.blue);

        footerPanel = new JPanel();
        footerPanel.setLayout(new BorderLayout());
        footerPanel.setBackground(Color.magenta);

        mainPanel.add(topLeft);
        mainPanel.add(topRight);
        mainPanel.add(bottomLeft);
        mainPanel.add(bottomRight);

        allPanels.add(headerPanel, BorderLayout.NORTH);
        allPanels.add(footerPanel, BorderLayout.SOUTH);
        allPanels.add(mainPanel);

        shopUI.add(allPanels);

        shopUI.setVisible(true);
}

1 个答案:

答案 0 :(得分:3)

我建议学习边框布局。

根据需要,将标题放在边框面板的NORTH中,将页脚放在SOUTH中。你如何做其他面板取决于你想要他们做什么;如果你总是希望它们彼此相同,你可以使用gridlayout;如果没有,您可以使用boxlayout水平放置两对或垂直放置两对,同样取决于您在框架调整大小时要执行的操作。

我认为通过首先决定你想要发生什么来简化使用布局管理器,包括调整帧大小时会发生什么。这无论如何都是布局的重要组成部分 - 什么是拉伸,什么排列等等。

反正。你有什么看起来像经典BorderLayout给我。如果您需要进一步的帮助,请告诉我们。顺便说一句,BorderLayout是JFrame的默认值...

...编辑

当你在面板中添加某些内容时,这会变得更有趣......

package simpleborderlayout;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Main
{

    public static void main(String[] args)
    {
        Main main = new Main(args);
        main.go();
    }

    public Main(String ... args)
    {}

    public void go()
    {
        JPanel headerPanel = getPanel(Color.RED);
        JPanel footerPanel = getPanel(Color.BLUE);

        JPanel p1 = getPanel(Color.GRAY);
        JPanel p2 = getPanel(Color.GRAY);
        JPanel p3 = getPanel(Color.GRAY);
        JPanel p4 = getPanel(Color.GRAY);

        GridLayout gridLayout = new GridLayout(2,2);
        JPanel middlePanel = new JPanel(gridLayout);
        middlePanel.add(p1);
        middlePanel.add(p2);
        middlePanel.add(p3);
        middlePanel.add(p4);

        JFrame mainFrame = new JFrame();
        mainFrame.add(headerPanel, BorderLayout.NORTH);
        mainFrame.add(middlePanel, BorderLayout.CENTER);
        mainFrame.add(footerPanel, BorderLayout.SOUTH);
        mainFrame.pack();

        mainFrame.setVisible(true);

    }

    private JPanel getPanel(Color c)
    {
        JPanel result = new JPanel();
        result.setBorder(BorderFactory.createLineBorder(c));
        return result;
    }

}