Java GUI Swing,GridLayout中的按钮,按钮之间没有空格

时间:2016-05-19 18:05:39

标签: java swing button layout grid

我想创建一个按钮网格。在按钮之间不应有空格,以便按钮触摸下一个按钮。

import javax.swing.*; 
import java.awt.*; 
import javax.swing.border.*;
public class Bild extends JFrame { 
    public static class createButton extends JPanel { 
        public createButton() {
            JButton b = new JButton(); 
            Border border = new LineBorder(Color.BLACK, 1);
            b.setBorder(border);
            b.setBackground(Color.WHITE);
            b.setPreferredSize (new Dimension(10,10));
            this.add(b); 
        }
    }

    public Bild() {
        GridLayout layout = new GridLayout(10,10,0,0);
        this.setLayout(layout); 
        for (int i = 0; i < 100; i++) {
            this.add(new createButton());
        }
    }
}

import javax.swing.*; 
import java.awt.*; 
public class Main{
    public static void main (String[] args) {
        JFrame frame = new Bild();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        frame.setSize(500,500);
        frame.setVisible(true);
    }
}

使用网格布局我试图获得一个10x10网格的按钮。但是虽然我使用参数10,10,0,0创建了GridLayout,但按钮之间还是有一个空格。 我的错误在哪里?

1 个答案:

答案 0 :(得分:1)

这是因为createButton实际上是JPanel,默认情况下它的布局管理器有FlowLayout。使createButton方法返回JButton,该按钮将跨越单元格中的整个空间。 (您可以删除setPreferredSize())。如果您希望按钮保持10x10像素并在框架中居中:将主面板的布局管理器设置为GridBagLayout,并向其添加JPanel GridLayout。也可以覆盖按钮的getPreferredSize(),而不是调用setPreferredSize()

跨越整个屏幕的按钮:

class Bild extends JFrame {

    public JButton createButton() {
        JButton b = new JButton();
        Border border = new LineBorder(Color.BLACK, 1);
        b.setBorder(border);
        b.setBackground(Color.WHITE);
        return b;
    }

    public Bild() {
        setLayout(new GridLayout(10, 10));
        for (int i = 0; i < 100; i++) {
            add(createButton());
        }
    }
}

按钮剩余10x10:

class Bild extends JFrame {

    public JButton createButton() {
        JButton b = new JButton() {
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(10, 10);
            }
        };
        Border border = new LineBorder(Color.BLACK, 1);
        b.setBorder(border);
        b.setBackground(Color.WHITE);
        return b;
    }

    public Bild() {
        JPanel panel = new JPanel(new GridLayout(10, 10));
        for (int i = 0; i < 100; i++) {
            panel.add(createButton());
        }
        setLayout(new GridBagLayout());
        add(panel);
    }
}