2010-12-02 234 views
3

我正在用Java構建一個國際象棋遊戲,而且我正在按照我想要的方式使用Swing來處理GUI。我使用GridLayout來組織一個8x8,ChessButton s的網格(它覆蓋了JButton,這樣我就可以在其中存儲諸如座標的額外信息)。最初,ChessButton s不會出現,除非我對它們進行掩蓋,但我通過將每個ChessButton放置在單獨的JPanel內並將每個按鈕的setPreferredSize()設置爲設定的高度和寬度來解決該問題。Java Swing - JPanel和GridLayout頁邊距/填充

現在,我的問題是,每個按鈕上方(和/或下方)似乎都有一個小的邊距或填充。我已經確定爲GridLayout設置了setHgap(0)setVgap(0),所以我很確定神祕的餘量來自按鈕或JPanel s。但是,我似乎無法擺脫它們,而且他們似乎每當我將鼠標移動時,它們都會使每個上/下位移一點點。

我意識到問題的描述可能有點難以想像,所以我採取了屏幕截圖(使用JButton真是讓人不是ChessButton S左右的間隙稍微容易識別):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比較陌生,所以我很抱歉,如果答案非常明顯,但我會很感激任何人可能提供的幫助!提前致謝!

回答

3

本來,ChessButtons將不會出現,除非我打探過他們,但我通過把每個ChessButton一個單獨的JPanel內,設置每個按鈕的了setPreferredSize()的解決了這個問題設置高度和寬度

這不是合適的解決方案。沒有理由使用JPanel來保存按鈕。事實上,這可能是問題的原因。將這些按鈕添加到GridLayout時,按鈕應顯示出來。如果它們沒有顯示出來,可能是因爲您在使GUI可見之後將按鈕添加到GUI。組件應該添加到GUI之前,它是可見的。

現在,我的問題是,似乎有一個小幅度或填充以上(和/或低於?)每個按鈕

我不明白,爲什麼也沒有水平間隙。當你創建一個JPanel時,默認情況下它使用一個FlowLayout,它也包含一個5像素的水平/垂直間隙。所以我明白爲什麼你可能有10像素的垂直間隙。我不明白爲什麼沒有橫向差距。

如果您需要更多幫助,請發送您的SSCCE來證明問題。 SSCCE應該使用常規的JButton。在開始使用自定義組件之前,先了解使用標準組件的基礎知識。這樣你就知道問題是否與你的自定義代碼相關。

+0

這是一個很好的觀點。爲了避免這個問題,我的示例使用`GridLayout`沒有間隙。 – trashgod 2010-12-02 05:36:00

0

嘗試添加chessBoard.setPreferredSize(600,600)爲僅有空間適合按鈕的單板創建JPanel(每個按鈕上的8個按鈕,每個按鈕的大小爲75個大小)。

+0

嗯,這似乎沒有改變任何東西,不幸的是。事實上,如果我垂直調整窗口大小,無論窗口有多小,這些邊界/邊界都會保留。 – dwat 2010-12-02 04:58:53

16

請勿添加空白邊框;請使用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(); 
      } 
     }); 
    } 
} 
+1

另請參閱http://stackoverflow.com/questions/2563350 – trashgod 2010-12-02 05:31:27