繁体   English   中英

Java Swing - JPanel和GridLayout边距/填充

[英]Java Swing - JPanel and GridLayout Margins/Padding

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

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

我意识到这个问题的描述可能有点难以想象,所以我拍了一张截图(使用JButton而不是ChessButton因此差距更容易识别): httpChessButton 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

替代文字

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();
            }
        });
    }
}

最初,ChessButtons不会出现,除非我将它们蒙上,但我通过将每个ChessButton放在一个单独的JPanel中并将每个按钮的setPreferredSize()设置为设置的高度和宽度来解决这个问题

这不是正确的解决方案。 没有理由使用JPanel来按住按钮。 事实上,这可能是问题的原因。 将它们添加到GridLayout时,按钮应显示。 如果它们没有显示它可能是因为您在使GUI可见后将按钮添加到GUI。 组件应该在显示之前添加到GUI中。

现在,我的问题是每个按钮上方(和/或下方?)似乎有一个小的边距或填充

我不明白为什么也没有横向差距。 创建JPanel时,默认情况下它使用FlowLayout,它还包含5像素的水平/垂直间隙。 所以我理解为什么你可能有10像素的垂直间隙。 我不明白为什么没有横向差距。

如果您需要更多帮助,请在SSCCE上发布问题。 SSCCE应该使用常规的JButton。 在开始使用自定义组件之前,先了解使用标准组件的基础知识。 这样您就知道问题是否与您的自定义代码有关。

尝试添加chessBoard.setPreferredSize(600,600)来为电路板创建一个JPanel,它只有适合按钮的空间(每个方向8个按钮*按钮单向75个尺寸)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM