3

私は Java でチェス ゲームを作成する作業を行っていますが、現在、Swing で GUI を思いどおりに作成するのに少し苦労しています。私は を使用してGridLayout8x8ChessButtonのグリッドを整理しています (これは をオーバーライドしてJButton、座標などの追加情報を内部に保存できるようにします)。もともと、ChessButtons はマウスオーバーしないと表示されませんでしたが、それぞれChessButtonを別々の中に配置しJPanel、各ボタンsetPreferredSize()を設定された高さと幅に設定することで、その問題を解決しました。

さて、私の問題は、各ボタンの上(および/または下?)に小さなマージンまたはパディングがあるように見えることです。に と を設定setHgap(0)setVgap(0)たことを確認しGridLayoutたので、謎のマージンはボタンまたはJPanels のいずれかから来ていると確信しています。しかし、私はそれらを取り除くことができないようで、ChessButtonマウスでマウスを動かすたびに、それぞれが少し上下にシフトしているようです。

この問題の説明は視覚化するのが少し難しいかもしれないことを認識しているので、スクリーンショットを撮りました ( JButtons ではなくChessButtons を使用して、ギャップがわずかに認識しやすいようにします): 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に比較的慣れていないので、答えが非常に明白である場合は申し訳ありませんが、誰かが提供する必要がある助けをいただければ幸いです! 前もって感謝します!

4

3 に答える 3

16

空の境界線を追加しないでください。使用してくださいsetBorderPainted(false)

補遺: @camickr が指摘しているように、パネルのレイアウトにはデフォルトのギャップが含まれる場合があります。以下の例では、それに応じて no-gap を使用してい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();
            }
        });
    }
}
于 2010-12-02T04:59:28.557 に答える
3

もともと、ChessButton はマウスオーバーしないと表示されませんでしたが、各 ChessButton を個別の JPanel 内に配置し、各ボタンの setPreferredSize() を設定された高さと幅に設定することで、この問題を解決しました。

それは適切な解決策ではありません。JPanel を使用してボタンを保持する理由はありません。実際、これがおそらく問題の原因です。ボタンを GridLayout に追加すると、ボタンが表示されるはずです。それらが表示されない場合は、GUI を表示した後に GUI にボタンを追加したことが原因である可能性があります。コンポーネントは、表示される前に GUI に追加する必要があります。

さて、私の問題は、各ボタンの上(および/または下?)に小さなマージンまたはパディングがあるように見えることです

横の隙間も無い理由がわかりません。JPanel を作成すると、デフォルトで、5 ピクセルの水平/垂直ギャップも含む FlowLayout が使用されます。10 ピクセルの垂直方向のギャップがある理由がわかりました。横の隙間がない理由がわかりません。

さらに支援が必要な場合は、問題を示すSSCCEを投稿してください。また、SSCCE は通常の JButton を使用する必要があります。カスタム コンポーネントを操作する前に、標準コンポーネントの操作の基本を習得してください。そうすれば、問題がカスタム コードにあるかどうかがわかります。

于 2010-12-02T05:22:58.257 に答える
1

chessBoard.setPreferredSize(600, 600) を追加して、ボタンを収めるスペースしかないボード用の JPanel を作成してみてください (各方向に 8 ボタン * ボタンの各方向に 75 サイズ)。

于 2010-12-02T04:43:39.140 に答える