2016-11-25 98 views
2

我已經獲得了一個創建3組座位的任務,每組都有3行和10列座位。首先,爲了開始,我爲三組創建了一個座位,並且我現在試圖使用佈局管理器以3x10樣式顯示座位(它們是JButtons)。下面的代碼我有:創建JButtons的行和列

public class ConcertPanel extends JPanel 
{ 
    private JPanel Panel1; 
    private JButton goldSeat; 
    private JButton silverSeat; 
    private JButton bronzeSeat; 


    ConcertPanel() 
    { 
     Panel1 = new JPanel(); 
     Panel1.setSize(500,500); 

       setLayout(new GridLayout(rows, cols)); 
       for(int i = 0; i < rows; i++) 
       for(int j = 0; j < cols; j++) 
      { 
       goldSeat = new JButton(); 
       silverSeat = new JButton(); 
       bronzeSeat = new JButton(); 
       add(new JButton()); 
      } 
       this.add(Panel1); 

     } 
} 

在一分鐘我剛開始在JPanel中30個按鈕,它們不在行或列在哪裏?幫助:(

+1

你要創建一個goldSeat,一個silverSeat和bronzeSeat,而你什麼都不做與他們 - 你不加入他們到GUI。然後創建另一個JButton並將其添加到GUI - 爲什麼?這沒有意義。同樣你也使用JPanel爲GridLayout添加一個空白的JPanel - 又是爲什麼?請解釋你想要做的事情。 –

+0

我必須建立一個預訂系統,那裏有一套金座位,銀座位和青銅座位。每種顏色的座位有三排,每排包含10個座位(30個金座,30個銀和30個銅)。成爲一個JButton的席位,在這裏我試圖讓座位的佈局成爲行和列。 – May

+1

問題是,如果你創建一個JButton,你需要通過調用它的'add(...)'方法將它添加到ConcertPanel中,否則你只是在旋轉你的輪子 - 有意義嗎? –

回答

4

請再看看在GridLayout tutorial

  • 希望將GridLayout的設置到容器上一次
  • 你沒有第二個參數與網格佈局添加時添加組件(JButton的) 。
  • 如果佈局應該是3×10,你要30個組件添加到這個容器。
  • 你要再添加的JPanel,PANEL1,在網格佈局,使用的JPanel,它將成爲一部分網格,看起來你不想這樣做。

例如:

Example GUI

import java.awt.GridLayout; 

import javax.swing.*; 

public class GridLayoutEg extends JPanel { 
    private static final int ROWS = 3; 
    private static final int COLS = 10; 

    public GridLayoutEg() { 
     setLayout(new GridLayout(ROWS, COLS)); // set JPanel's layout 
     for (int i = 0; i < ROWS; i++) { 
      for (int j = 0; j < COLS; j++) { 
       String text = String.format("[%d, %d]", j + 1, i + 1); 
       add(new JButton(text)); // add component w/o 2nd parameter 
      } 
     } 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 

    private static void createAndShowGui() { 
     GridLayoutEg mainPanel = new GridLayoutEg(); 
     JFrame frame = new JFrame("GridLayoutEg"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 
} 

編輯

見與此代碼問題的意見:

for (int i = 0; i < rows; i++) 
     for (int j = 0; j < cols; j++) { 
      goldSeat = new JButton(); // button created but never added 
      silverSeat = new JButton(); // button created but never added 
      bronzeSeat = new JButton(); // button created but never added 
      add(new JButton()); // only button added 
     } 
    this.add(Panel1); // this throws off the whole GridLayout since it's added to the grid 

所以在我們的嵌套for循環中,你創建了3個JButton,但是因爲它們從來沒有被添加到GUI中,所以它們沒有任何用處,實際上它們將被垃圾收集,除了最後創建的3個之外。然後創建一個按鈕並添加它。最後,你創建一個JPanel,但將它添加到GridLayout中 - 使用JPanel,它將關閉網格。


有更多的樂趣與此代碼:

import java.awt.Color; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 

import javax.swing.*; 
import javax.swing.border.BevelBorder; 
import javax.swing.border.Border; 

public class GridLayoutEg extends JPanel { 
    private static final long serialVersionUID = 1L; 
    private static final int ROWS = 3; 
    private static final int COLS = 10; 

    public GridLayoutEg() { 
     int gap = 1; 
     int gap2 = 2; 
     setBorder(BorderFactory.createEmptyBorder(gap2, gap2, gap2, gap2)); 
     setLayout(new GridLayout(ROWS, COLS, gap, gap)); // set JPanel's layout 
     for (int row = 0; row < ROWS; row++) { 
      for (int col = 0; col < COLS; col++) { 
       JButton button = createSeat(row, col); 
       add(button); // add component w/o a 2nd parameter 
      } 
     } 
    } 

    private JButton createSeat(int row, int col) { 
     SeatColor seatColor = SeatColor.values()[row]; 
     SeatAction seatAction = new SeatAction(seatColor, col); 
     JButton button = new JButton(seatAction); 
     button.setBackground(seatColor.getColor()); 
     int topGap = 8; 
     int sideGap = 25; 
     Border innerBorder = BorderFactory.createEmptyBorder(topGap, sideGap, topGap, sideGap); 
     Border outerBorder = BorderFactory.createBevelBorder(BevelBorder.RAISED, seatColor.getColor().brighter(), 
       seatColor.getColor().darker()); 
     Border border = BorderFactory.createCompoundBorder(outerBorder, innerBorder); 
     button.setBorder(border); 
     return button; 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 

    private static void createAndShowGui() { 
     GridLayoutEg mainPanel = new GridLayoutEg(); 
     JFrame frame = new JFrame("GridLayoutEg"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 
} 

class SeatAction extends AbstractAction { 
    private static final long serialVersionUID = 1L; 
    private SeatColor seatColor; 
    private int column; 

    public SeatAction(SeatColor seatColor, int column) { 
     super(String.format("[%d]", column)); 
     this.seatColor = seatColor; 
     this.column = column; 
     // putValue(LARGE_ICON_KEY, createIcon(seatColor, column)); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     AbstractButton btn = (AbstractButton) e.getSource(); 
     btn.setBackground(seatColor.getColor().brighter()); 
     setEnabled(false); 

     String text = String.format("Selected Seat Color: %s; Column: %d", seatColor, column); 
     System.out.println(text); 
    } 
} 

enum SeatColor { 
    GOLD("Gold", new Color(255, 215, 0)), 
    SILVER("Silver", new Color(192, 192, 192)), 
    BRONZE("Bronze", new Color(205, 127, 50)); 

    private String text; 
    private Color color; 

    private SeatColor(String text, Color color) { 
     this.text = text; 
     this.color = color; 
    } 

    public String getText() { 
     return text; 
    } 

    public Color getColor() { 
     return color; 
    } 

    @Override 
    public String toString() { 
     return getText(); 
    } 

} 
+0

試圖使用你的代碼作爲一個guidline它確實給了我30個JButtons,但是它不會給我它們的行和列。這就是我現在所做的。ps你可以告訴我不擅長編碼 - setLayout(new GridLayout(rows,cols)); (int j = 0; j May

+0

@五月:你好!不幸的是代碼在評論中顯示不好。如果仍然卡住,請編輯您的原始問題,在底部顯示新代碼和問題。看起來你正在創建一堆(4)按鈕,並且只將最後一個添加到GUI,這看起來有點令人困惑。請通過編輯您的帖子來澄清。 –