2014-07-21 102 views
0

我想創建一個與Java swing的棋盤遊戲,但我已經變得非常困惑與佈局。此刻,我正試圖創建用戶所看到的圖像。爲了做到這一點,我使用了BorderLayout(我只需要使用邊界網格流佈局),我認爲我會在東南西北部放置一些工作人員,並在中心放置基礎板。問題是我必須創建道具使用JButton移動的路徑(其餘空間應該留空),並且該路徑需要具有特定的交叉形狀:http://i59.tinypic.com/eileys.png並且尺寸應該比平常小。對於初學者,我嘗試過使用帶有網格佈局的JPanel(放在中間),但是無論我做什麼(如setPreferredSize()),按鈕都將調整大小以填充空間。 這是我的代碼。謝謝你的時間,任何提示都會有幫助! 編輯:Java swing JButton的順序和大小

package projtest1; 

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.FlowLayout; 
import java.awt.Font; 
import java.awt.GridLayout; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Board extends JFrame 
{ 
    public Board() 
    { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setTitle("Border Layout"); 
     setMinimumSize(new Dimension(1280, 768)); 
     setSize(1280, 768); 
     JPanel contentPane = new JPanel(); 
     contentPane.setLayout(new BorderLayout()); 
     contentPane.add(new JButton("North"), BorderLayout.NORTH); 
     contentPane.add(new JButton("South"), BorderLayout.SOUTH); 
     contentPane.add(new JButton("West"), BorderLayout.WEST); 
     contentPane.add(new JButton("East"), BorderLayout.EAST); 
     JPanel buttonPanel = new JPanel(); 
     buttonPanel.setLayout(new GridLayout(3, 1, 1, 1)); 
     buttonPanel.setSize(new Dimension (800,800)); 
     JPanel topButtonPanel = new JPanel(); 
     JPanel middleButtonPanel = new JPanel(); 
     JPanel lastButtonPanel = new JPanel(); 
     topButtonPanel.setLayout(new GridLayout(6, 3, 1, 1)); 
     middleButtonPanel.setLayout(new GridLayout(3, 15, 1, 1)); 
     lastButtonPanel.setLayout(new GridLayout(6, 3, 1, 1)); 
     topButtonPanel.setSize(new Dimension (100,300)); 
     //topButtonPanel.setMinimumSize(new Dimension (100,300)); 
     middleButtonPanel.setSize(new Dimension (700,100)); 
     lastButtonPanel.setSize(new Dimension (100,300)); 
     for (int i=0; i<18; i++) 
     { 
      JButton button = new JButton("(" + i + ")"); 
      button.setFont(new Font("",Font.BOLD,10)); 
      button.setPreferredSize(new Dimension(4, 4)); 
      topButtonPanel.add(button); 
     } 
     for (int i=0; i<45; i++) 
     { 
      JButton button = new JButton("(" + i + ")"); 
      button.setFont(new Font("",Font.BOLD,10)); 
      button.setPreferredSize(new Dimension(4, 4)); 
      middleButtonPanel.add(button); 
     } 
     for (int i=0; i<18; i++) 
     { 
      JButton button = new JButton("(" + i + ")"); 
      button.setFont(new Font("",Font.BOLD,10)); 
      button.setPreferredSize(new Dimension(4, 4)); 
      lastButtonPanel.add(button); 
      buttonPanel.add(topButtonPanel); 
      buttonPanel.add(middleButtonPanel); 
      buttonPanel.add(lastButtonPanel); 
     } 

     contentPane.add(buttonPanel, BorderLayout.CENTER); 
     setContentPane(contentPane); 
    } 

} 
+0

您確定要爲此使用JButton嗎?或者,只需顯示圖像(電路板),將MouseListener添加到顯示組件,然後使用一些基本的數學運算,計算用戶在電路板上的點擊位置以及點擊位置的基礎行爲。 –

+0

這是一個項目,我們被告知只使用JButtons,並且只使用flowlayout,borderlayout和gridlayout。 –

+1

然後把你複雜的gui分解成它的組成矩形,給它們所有合適的佈局管理器,並將它們嵌套在一起。 –

回答

5

我會盡量告訴你一個辦法讓這樣的主板:只用FlowLayoutGridLayout

你首先需要的
gameboard
JPanel那將包含董事會。如果你願意,你可以用BorderLayout將它放在你的Frame的中心。

---------------------- 
|      | 
|      | 
|      | 
|      | 
|  mainpanel  | 
|      | 
|      | 
|      | 
---------------------- 

我們將給它一個FlowLayout,以便它可以包含不同大小的其他組件。但Flowlayout太動態,所以我們需要修復整個面板的大小,並設置resizable(false)

根據我們計算15×15的按鈕,所以爲了簡單起見讓設置大小600x600尺寸爲面板(每個按鈕將具有40x40像素)

接下來,我們添加一些其它組分到面板的圖像。有這就是所謂Filler Swing組件 - 它僅僅填補空白,我們需要一些JPanel S其中我們把按鈕放在

---------------------- 
|  |  |  | 
| 1 | 2 | 3 | 
|_______|_____|_______| 
|  |  |  | 
| 4 | 5 | 6 | 
|_______|_____|_______| 
|  |  |  | 
| 7 | 8 | 9 | 
|  |  |  | 
---------------------- 

組件1,3,7和9填料。你可以像這樣初始化它們:

filler1 = new javax.swing.Box.Filler(new java.awt.Dimension(240, 240), new java.awt.Dimension(240, 240), new java.awt.Dimension(240, 240)); 
filler3 = new javax.swing.Box.Filler(new java.awt.Dimension(240, 240), new java.awt.Dimension(240, 240), new java.awt.Dimension(240, 240)); 
filler7 = new javax.swing.Box.Filler(new java.awt.Dimension(240, 240), new java.awt.Dimension(240, 240), new java.awt.Dimension(240, 240)); 
filler9 = new javax.swing.Box.Filler(new java.awt.Dimension(240, 240), new java.awt.Dimension(240, 240), new java.awt.Dimension(240, 240)); 

這三個Dimensions將確保填充物的最小和最大尺寸爲240x240像素。

組件2,4,5,6和8是JPanel。他們需要被添加到您的主面板中的順序如下:

現在我們已經基本組件
JPanel panel2 = new JPanel(); 
JPanel panel4 = new JPanel(); 
JPanel panel5 = new JPanel(); 
JPanel panel6 = new JPanel(); 
JPanel panel8 = new JPanel(); 

mainPanel.add(filler1); // component 1 
mainPanel.add(panel2); // component 2 
mainPanel.add(filler3); // component 3 

mainPanel.add(panel4); // component 4 
mainPanel.add(panel5); // component 5 
mainPanel.add(panel6); // component 6 

mainPanel.add(filler7); // component 7 
mainPanel.add(panel8); // component 8 
mainPanel.add(filler9); // component 9 

好吧,你可以看到,它們形成不大不小的十字...
我們的小組將包含buttons並將所有網格佈局

panel2.setLayout(new java.awt.GridLayout(6, 3)); 
panel4.setLayout(new java.awt.GridLayout(3, 6)); 
panel6.setLayout(new java.awt.GridLayout(3, 6)); 
panel8.setLayout(new java.awt.GridLayout(6, 3)); 

panel5可以忽略不計..其實,這只是我們的一個填料現在。

現在您創建一個72(!!)JButtons的列表,就像您在上面的循環中所做的一樣。 將前18個按鈕添加到panel2,接下來的18個按鈕添加到panel4,接下來的18個到panel6,最後18個按鈕到panel8

而你有它。

_____________________________ 
|   |_|_|_|   | 
|   |_|_|_|   | 
|   |_|_|_|   | 
|   |_|_|_|   | 
|   |_|_|_|   | 
|___________|_|_|_|___________| 
|_|_|_|_|_|_|  |_|_|_|_|_|_| 
|_|_|_|_|_|_|  |_|_|_|_|_|_| 
|_|_|_|_|_|_|_____|_|_|_|_|_|_| 
|   |_|_|_|   | 
|   |_|_|_|   | 
|   |_|_|_|   | 
|   |_|_|_|   | 
|   |_|_|_|   | 
|___________|_|_|_|___________| 
+0

這是如此透露,謝謝。 –

+0

你去了。 1+ –