Java Swing-JFrame中的多布局体系结构

Java Swing-JFrame中的多布局体系结构,java,swing,gridview,layout,Java,Swing,Gridview,Layout,我希望使用可用的布局(如GridBagLayout)为我的Java应用程序实现以下网格系统: 我设法创建了一个类似的布局,但没有使用较小的按钮,只使用GridBagLayout,但是当我尝试添加那些较小的按钮时,它不起作用,因为它的单元格大小不同 我认为一个解决方案可以是向JFrame添加多个布局,每个布局代表全局布局的一部分,但我找不到合适的布局来使用 一个GridBagLayout用于创建所有较大的方形部分,两个较大的部分,一个包含左上角的项目,另一个包含以下8个较小的按钮,这样是否可行

我希望使用可用的布局(如
GridBagLayout
)为我的Java应用程序实现以下网格系统:

我设法创建了一个类似的布局,但没有使用较小的按钮,只使用
GridBagLayout
,但是当我尝试添加那些较小的按钮时,它不起作用,因为它的单元格大小不同

我认为一个解决方案可以是向JFrame添加多个布局,每个布局代表全局布局的一部分,但我找不到合适的布局来使用

一个
GridBagLayout
用于创建所有较大的方形部分,两个较大的部分,一个包含左上角的项目,另一个包含以下8个较小的按钮,这样是否可行


谢谢。

不要将按钮直接添加到JFrame中,而是将它们放在一个JPanel中,该JPanel有自己的GridBagLayout,具有您想要的单元格大小。这样,您可以添加JPanel并将所需大小的按钮放入其中。

我“认为”您所说的是使用复合布局,即使用一个或多个子容器为特定区域进行特定布局,并将这些容器组合到另一个具有另一个布局的容器中,可能类似于

因此,较小的
4x2
网格实际上是另一个
JPanel
,它负责该区域的细节(您可能会使用
GridLayout
),然后将其合并到较大的布局中

import java.awt.Color;
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            setBackground(Color.BLACK);
            setLayout(new GridBagLayout());

            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 0;
            gbc.fill = GridBagConstraints.BOTH;
            gbc.weightx = 0.75;
            gbc.weighty = 0.16;
            gbc.gridwidth = 3;
            gbc.insets = new Insets(4, 4, 4, 4);
            add(makePanel(Color.DARK_GRAY), gbc);

            gbc.weightx = 0.25;
            gbc.gridx = 3;
            gbc.gridwidth = 1;
            add(makePanel(Color.ORANGE), gbc);

            gbc.gridy++;
            add(makePanel(Color.DARK_GRAY), gbc);

            gbc.gridx = 0;
            gbc.gridwidth = 3;
            gbc.weightx = 0.75;
            add(makeSmallerPane(), gbc);

            gbc = new GridBagConstraints();
            gbc.weightx = 0.25;
            gbc.insets = new Insets(4, 4, 4, 4);
            gbc.weighty = 0.16;
            gbc.fill = GridBagConstraints.BOTH;
            for (int y = 2; y < 7; y++) {
                gbc.gridx = y;
                for (int x = 0; x < 4; x++) {
                    gbc.gridx = x;
                    Color color = Color.GRAY;
                    if (x == 3) {
                        color = Color.DARK_GRAY;
                    }
                    add(makePanel(color), gbc);
                }
            }
        }

        protected Component makePanel(Color color) {
            JPanel panel = new JPanel();
            panel.setBackground(color);
            return panel;
        }

        protected Component makeSmallerPane() {
            JPanel panel = new JPanel(new GridBagLayout());
            panel.setOpaque(false);
            panel.setLayout(new GridBagLayout());;
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 0;
            gbc.fill = GridBagConstraints.BOTH;
            gbc.weightx = 0.25;
            gbc.weighty = 0.5;
            gbc.insets = new Insets(0, 0, 0, 4);

            int topGap = 0;
            int bottomGap = 4;
            for (int y = 0; y < 2; y++) {
                gbc.gridy = y;
                for (int x = 0; x < 4; x++) {
                    gbc.gridx = x;
                    switch (x) {
                        case 0:
                            gbc.insets = new Insets(topGap, 0, bottomGap, 4);
                            break;
                        case 3:
                            gbc.insets = new Insets(topGap, 4, bottomGap, 0);
                            break;
                        default:
                            gbc.insets = new Insets(topGap, 4, bottomGap, 4);
                            break;
                    }
                    panel.add(makePanel(Color.DARK_GRAY), gbc);
                }
                topGap = 4;
                bottomGap = 0;
            }

            return panel;
        }

    }

}
导入java.awt.Color;
导入java.awt.Component;
导入java.awt.EventQueue;
导入java.awt.GridBagConstraints;
导入java.awt.GridBagLayout;
导入java.awt.Insets;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.UIManager;
导入javax.swing.UnsupportedLookAndFeelException;
公开课考试{
公共静态void main(字符串[]args){
新测试();
}
公开考试(){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
试一试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}catch(ClassNotFoundException |实例化Exception | IllegalacessException |不支持ookandfeelException ex){
例如printStackTrace();
}
JFrame=新JFrame(“测试”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(newtestpane());
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
});
}
公共类TestPane扩展了JPanel{
公共测试窗格(){
挫折背景(颜色:黑色);
setLayout(新的GridBagLayout());
GridBagConstraints gbc=新的GridBagConstraints();
gbc.gridx=0;
gbc.gridy=0;
gbc.fill=GridBagConstraints.BOTH;
gbc.weightx=0.75;
gbc.weighty=0.16;
gbc.gridwidth=3;
gbc.插图=新插图(4,4,4,4);
添加(makePanel(颜色:深灰色),gbc);
gbc.weightx=0.25;
gbc.gridx=3;
gbc.gridwidth=1;
添加(makePanel(颜色为橙色),gbc);
gbc.gridy++;
添加(makePanel(颜色:深灰色),gbc);
gbc.gridx=0;
gbc.gridwidth=3;
gbc.weightx=0.75;
添加(makeSmallerPane(),gbc);
gbc=新的GridBagConstraints();
gbc.weightx=0.25;
gbc.插图=新插图(4,4,4,4);
gbc.weighty=0.16;
gbc.fill=GridBagConstraints.BOTH;
对于(int y=2;y<7;y++){
gbc.gridx=y;
对于(int x=0;x<4;x++){
gbc.gridx=x;
颜色=颜色。灰色;
如果(x==3){
颜色=颜色。深灰色;
}
添加(makePanel(颜色),gbc);
}
}
}
受保护的组件makePanel(彩色){
JPanel面板=新的JPanel();
面板.立根背景(颜色);
返回面板;
}
受保护的组件makeSmallerPane(){
JPanel panel=newjpanel(newgridbagloayout());
面板。设置不透明(假);
panel.setLayout(新的GridBagLayout());;
GridBagConstraints gbc=新的GridBagConstraints();
gbc.gridx=0;
gbc.gridy=0;
gbc.fill=GridBagConstraints.BOTH;
gbc.weightx=0.25;
gbc.weighty=0.5;
gbc.insets=新的insets(0,0,0,4);
int-topGap=0;
int-bottomGap=4;
对于(int y=0;y<2;y++){
gbc.gridy=y;
对于(int x=0;x<4;x++){
gbc.gridx=x;
开关(x){
案例0:
gbc.插图=新插图(顶部间隙,0,底部间隙,4);
打破
案例3:
gbc.插图=新插图(顶部间隙,4,底部间隙,0);
打破
违约:
gbc.插图=新插图(顶部间隙,4,底部间隙,4);
打破
}
面板。添加(makePanel(颜色:深灰色),gbc);
}
topGap=4;
底部间隙=0;
}
返回面板;
}
}
}

这完全取决于您希望单元格调整大小的“方式”。较小的4x2网格可以放在它自己的容器中,这将简化问题实际上整个JFrame无法调整大小,因此我可以将4x2网格放在另一个容器中