Java Swing - JPanel 和 GridLayout 边距/填充

标签 java swing border margin grid-layout

我正在使用 Java 构建一个国际象棋游戏,目前我在使用 Swing 完全按照我想要的方式获取 GUI 时遇到了一些麻烦。我正在使用 GridLayout 来组织一个 8x8 ChessButton 的网格(它会覆盖 JButton,以便我可以在其中存储额外的信息如坐标)。最初,ChessButton 不会出现,除非我将鼠标悬停在它们上面,但我通过将每个 ChessButton 放在单独的 JPanel 中解决了这个问题,并且将每个按钮的 setPreferredSize() 设置为设置的高度和宽度。

现在,我的问题是每个按钮上方(和/或下方?)似乎有一个小边距或填充。我已经确保为 GridLayout 设置了 setHgap(0)setVgap(0),所以我很确定神秘的边距来自按钮或 JPanel。但是,我似乎无法摆脱它们,而且它们似乎会导致每个 ChessButton 在我将它们放在鼠标上时向上/向下移动一点点。

我意识到这个问题的描述可能有点难以形象化,所以我拍了一张截图(使用 JButton 而不是 ChessButton 所以差距稍微更容易识别):http://img3.imageshack.us/img3/6656/jbuttonmargins.png

这是我用来初始化每个 ChessButton 的代码:

    chessBoard = new JPanel(new GridLayout(8, 8, 0, 0));
    chessBoard.setBorder(BorderFactory.createEmptyBorder());

    for (int i = 0; i <= 65; i++) {
            //Create a new ChessButton
            ChessButton button = new ChessButton("hi");
            button.setBorder(BorderFactory.createEmptyBorder());
            button.setPreferredSize(new Dimension(75, 75));
            button.setMargin(new Insets(0, 0, 0, 0));

            //Create a new JPanel that the ChessButton will go into
            JPanel buttonPanel = new JPanel();
            buttonPanel.setPreferredSize(new Dimension(75, 75));
            buttonPanel.setBorder(BorderFactory.createEmptyBorder());
            buttonPanel.add(button);

            //Add the buttonPanel to the grid
            chessBoard.add(buttonPanel);
    }

那么,我怎样才能摆脱按钮之间的这些垂直空间呢?我是 Swing 的新手,所以如果答案非常明显,我很抱歉,但我很感激任何人可能提供的任何帮助!提前致谢!

最佳答案

不要添加空边框;使用setBorderPainted(false) .

附录:正如@camickr 指出的那样,面板的布局可能包含默认间隙。下面的示例相应地使用了无间隙 GridLayout

alt text

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

/** @see http://stackoverflow.com/questions/4331699 */
public class ButtonBorder extends JPanel {

    private static final int N = 8;
    private static final int SIZE = 75;

    public ButtonBorder() {
        super(new GridLayout(N, N));
        this.setPreferredSize(new Dimension(N * SIZE, N * SIZE));
        for (int i = 0; i < N * N; i++) {
            this.add(new ChessButton(i));
        }
    }

    private static class ChessButton extends JButton {

        public ChessButton(int i) {
            super(i / N + "," + i % N);
            this.setOpaque(true);
            this.setBorderPainted(false);
            if ((i / N + i % N) % 2 == 1) {
                this.setBackground(Color.gray);
            }
        }
    }

    private void display() {
        JFrame f = new JFrame("ButtonBorder");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(this);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new ButtonBorder().display();
            }
        });
    }
}

关于Java Swing - JPanel 和 GridLayout 边距/填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4331699/

相关文章:

java - 如何使用 Mailgun 避免 Outlook/Hotmail 中的垃圾邮件?

Java:如何动态同步方法

java - 可以优化数组访问吗?

java - 如何在java中的点击事件中获取按钮名称

java - 如何模拟兼容apache common的ServletFileUpload的HTTP请求?

java - 我如何在java中居中对象

java - 添加 JFrame 事件处理程序之前滞后?

html - CSS3 透明边框覆盖其下所有元素层

css - 使元素缩小时左上/右上边框半径不变?

java - new xxxBorder() 和 Borderfactory 方法之间的区别?