2016-10-27 69 views
0

我正在嘗試使用GridBagLayout來創建一個包含具有網格佈局的JPanel和只有大按鈕的JPanel的JFrame。我希望所有行的大小相同,並且JButton的JPanel與一行的大小相同。但是,當前爲空的按鈕面板約爲JFrame的1/3。我不太清楚發生了什麼,但是對於我來說維護這個結構非常重要,因爲我的其他代碼使用了這種結構。任何幫助表示讚賞,並提前感謝您。使用GridBagLayout進行錯誤的大小調整

這是我的代碼:

import java.awt.*; 
import javax.swing.*; 
import javax.swing.border.*; 

public class Minesweeper extends JPanel { 
     private final int SIZE = 7; 

     public void startGame(){ 
       JFrame holder = new JFrame(); 
       JPanel window = new JPanel(); 
       JPanel pan = new JPanel(); 
       holder.setLayout(new GridBagLayout()); 
       GridBagConstraints con = new GridBagConstraints(); 
       con.weightx = 1; 
       con.weighty = 1; 
       con.gridx = 0; 
       con.gridy = 0; 
       con.fill = GridBagConstraints.BOTH; 
       con.gridheight = SIZE; 
       con.gridwidth = SIZE; 
       holder.getContentPane().setBackground(Color.darkGray); 
       holder.setSize(450, 450); 
       holder.setResizable(false); 
       holder.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       window.setBackground(Color.darkGray); 
       window.setLayout(new GridLayout(SIZE, SIZE)); 
       for (int c=0; c<(SIZE*SIZE); c++){ 
         int row = (c/SIZE); 
         int col = (c%SIZE); 
         JPanel p = new JPanel(); 
         p.setBackground(Color.gray); 
         Border b = BorderFactory.createEtchedBorder(EtchedBorder.RAISED); 
         p.setBorder(b); 
         window.add(p); 
       } 
       holder.add(window, con); 
       con.gridx = 0; 
       con.gridy = SIZE+1; 
       con.gridheight = 0; 
       con.gridwidth = SIZE; 
       holder.add(pan, con); 
       holder.setVisible(true); 
     } 

     public static void main(String[] args){ 
       Minesweeper start = new Minesweeper(); 
       start.startGame(); 
     } 
} 

這是正在顯示的內容:

https://i.stack.imgur.com/HvguY.png

+0

'JPanel p = new JPanel();'你自己(和用戶)一個忙。做那個'JButton p = new JButton();'。我們可以將一個ActionListener添加到一個按鈕上,它會響應鼠標點擊和鍵盤操作。按鈕還支持圖標和/或文本(對空白瓷磚,清除瓷磚,地雷或周圍礦井的數量等有用)。 –

+0

我實際上已經寫了一個使用jpanels的面板類。目標是掃雷遊戲,所以我需要能夠更多地操縱它們。 – acn3

+0

*「所以我需要能夠操縱他們多一點。」*具體如何?我懷疑面板能做什麼,按鈕不能。 –

回答

1
con.gridy = SIZE+1; 

不能指定8. gridy值只有兩個添加到網格中的組件。網格不知道你的一個面板碰巧包含7行組件。所以值應該是1.

這不會解決問題,但應該清除對GridBagLayout如何工作的誤解。

holder.setSize(450, 450); 

您正在手動設置幀的大小。每個組件的尺寸原來都是按照其首選尺寸。當框架中有額外空間時,空間在兩個組件之間平均分配。

您不應該設置大小。每個組件都應該確定自己的尺寸,然後你應該使用pack()。因此,您需要使用自定義組件來覆蓋getPreferredSize()方法,以便爲每個組件返回適當的大小,以便pack()可以完成其工作。

而且,pack()setVisible()之前完成。

+0

因此,使用getPreferredSize()方法,你是說我只需要讓每個JPanel成爲一個具有名爲getPreferredSize()方法的類Panel的對象? – acn3