从Grid Layout到GridBagLayout

时间:2013-11-25 13:16:40

标签: java swing layout

我对Java Swing相对较新,我在理解Grid布局如何处理某些事情时遇到了一些麻烦,如果他们不能,那么Gridbag布局(据称更强大的布局)如何做到这一点。

这是我尝试使用网格布局

的程序
import javax.swing.*;
import java.awt.*;
//import java.awt.event.*;
public class Swing24
{
public static void main(String[] args)
{
JFrame f1= new JFrame("Grid Layout Test");

f1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f1.setResizable(true);
f1.setLocation(500,200);
f1.setSize(600,600);

JPanel p1 = new JPanel();
p1.setBackground(Color.black);
f1.add(p1);


JButton b1= new JButton("Button 1");
b1.setBackground(Color.white);

JButton b2= new JButton("Button 2");
b2.setBackground(Color.white);

JButton b3= new JButton("Button 3");
b3.setBackground(Color.white);

JLabel lb1=new JLabel(" Label 1");
lb1.setForeground(Color.orange);
//lb1.setOpaque(true);
lb1.setBackground(Color.yellow);

JLabel lb2=new JLabel(" Label 2");
lb2.setBackground(Color.orange);
lb2.setOpaque(true);


GridLayout glm1=new GridLayout(2,3,0,0); 
p1.setLayout(glm1);

p1.add(b1);
p1.add(b2);
p1.add(b3);
p1.add(lb1);
p1.add(lb2);


f1.setVisible(true);

}
}

上述程序允许我将容器分成2行3列。基本上我可以用一个网格布局将容器分成m行和n列。但它会连续添加组件(按钮和标签)。

问题1:如何在大小为(10,10)的网格中直接向单元格(4,3)添加按钮? 问题2:按钮可以占用网格布局中的多个单元吗?

如果无法解决上述任何问题,那么gridbag布局如何帮助解决问题。 我尝试使用带按钮的gridbag布局。但它被置于中心位置!我怎么能把它放在一个容器中的单元格(4,3)中,该容器可分为大小(10,10)<10行10列&gt;

1 个答案:

答案 0 :(得分:1)

1)您无法将组件添加到特定单元格,但在that question中,您可以找到某种类型的技巧。

2)这是另一个trick,在单元格内嵌有lyout,用于合并。

您可以在GridBagLayout的帮助下完成所需的一切。观看GridBagConstraints它可以帮助您正确布局组件。

查看GridBagConstraints的属性:

gridwidthgridheightgridxgridyanchor

但如果你只想在容器中添加一个组件,你需要在单元格(4,3)周围留出空格的技巧。

另请阅读GridBagLayout的教程。

编辑:你可以尝试这样的事情

public class Form extends JFrame {

    public Form() {
        getContentPane().setLayout(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();
        c.gridx = 0;
        c.gridy = 0;
        c.weightx = 1;
        c.weighty = 1;
        for(int i =0;i<10;i++){
            c.gridx = i;
            for(int j =0;j<10;j++){
                c.gridy = j;
                if(i == 3 && j == 2){
                    c.fill = GridBagConstraints.NONE;
                    getContentPane().add(new JButton("btn"),c);
                } else {
                    c.fill = GridBagConstraints.BOTH;
                    JPanel p = new JPanel();
                    p.setBorder(BorderFactory.createLineBorder(Color.red));
                    getContentPane().add(p,c);
                }
            }
        }

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
        setLocationRelativeTo(null);
    }


    public static void main(String[] args) throws Exception {
        SwingUtilities.invokeLater(new Runnable() {

            public void run() {
                new Form().setVisible(true);
            }
        });
    }   
}

enter image description here

EDIT2:它不是真正的细胞(4,3),而是相同的比例

public Form() {
    getContentPane().setLayout(new GridBagLayout());
    GridBagConstraints c = new GridBagConstraints();
    c.gridx = 0;
    c.gridy = 0;
    c.weightx = 0.2;
    c.weighty = 0.3;
    c.fill = GridBagConstraints.BOTH;
    getContentPane().add(new JLabel(" "),c);

    c.gridx++;
    c.gridy++;
    c.fill = GridBagConstraints.NONE;
    getContentPane().add(new JButton("btn"),c);

    c.weightx = 0.7;
    c.weighty = 0.6;
    c.gridx++;
    c.gridy++;
    c.fill = GridBagConstraints.BOTH;
    getContentPane().add(new JLabel(" "),c);

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    pack();
    setLocationRelativeTo(null);
}

或真实单元格(4,3),但超过3个组件且小于100:

public Form() {
    getContentPane().setLayout(new GridBagLayout());
    GridBagConstraints c = new GridBagConstraints();
    c.gridx = 0;
    c.gridy = 0;
    c.weightx = 1;
    c.weighty = 1;
    for(int i =0;i<2;i++){
        getContentPane().add(new JLabel(" "),c);
        c.gridx++;
    }

    for(int i =0;i<3;i++){
        getContentPane().add(new JLabel(" "),c);
        c.gridy++;
    }

    c.gridx = 3;
    c.gridy = 4;
    getContentPane().add(new JButton("btn"),c);

    for(int i =0;i<7;i++){
        getContentPane().add(new JLabel(" "),c);
        c.gridx++;
    }

    for(int i =0;i<6;i++){
        getContentPane().add(new JLabel(" "),c);
        c.gridy++;
    }
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    pack();
    setLocationRelativeTo(null);
}