簡體   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