2013-05-12 17 views
0

我研究了這個錯誤,我似乎無法找到解決方案。我正在嘗試創建一個包含40列和20行的800個JButton的網格。這將最終被用來控制一個多米諾骨牌搭建機器人,我正在做這件事將會顛倒多米諾骨牌。我已經使用GridLayout成功創建了一個網格,但是由於項目的性質,我希望其他每行都被半個按鈕偏移。通過這個我的意思是像一個電腦鍵盤上的按鍵設置。 (我會添加一個我想要解釋的有用圖片,但顯然,無法解釋事物的初學者不允許添加圖片,無論如何)。Java GridBagLayout和JPanel錯誤:不能添加到佈局:約束必須是一個字符串(或null)

我嘗試通過創建一個名爲Panel的20個面板的JPanel數組來完成此操作。然後我在面板上添加了40個JButton。然後我使用GridBagConstraints來抵消其他每一行。我讀到你不應該混合awt和swing,這可能是問題,但我不知道。這裏是代碼,我從YouTube教程中瞭解到這一點,因爲我是一名初學者。如果我說過的話沒有道理,請原諒我。代碼:

import java.awt.GridLayout; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
public class OffsetGrid { 

    public static void main (String [] args){ 
     JFrame Frame = new JFrame(); 
     Frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     GridLayout grid= new GridLayout(); 


     GridBagConstraints gbca= new GridBagConstraints(); 
     GridBagConstraints gbcb= new GridBagConstraints(); 
     JPanel[] panel=new JPanel[20]; 


     for (int row=0;row<20; row++){ 
       panel[row]=new JPanel(new GridBagLayout()); 
       gbca.gridx=1; 
       gbca.gridy=row; 
       gbcb.gridx=0; 
       gbcb.gridy=row; 

     for (int y=0; y<40;y++){ 
       grid=new GridLayout(1,40); 
       panel[row].setLayout(grid); 
       JButton[] button = new JButton[40]; 
       button[y]=new JButton(); 
       button[y].setOpaque(true); 
       panel[row].add(button[y]); 

       } 
      if (row%2==0){ 
       Frame.add(panel[row], gbcb); 
      } 
      else { 
       Frame.add(panel[row], gbca); 
      } 

    } 

     Frame.setVisible(true); 
     Frame.setLocationRelativeTo(null); 
     Frame.pack(); 
} 
} 

錯誤:

Exception in thread "main" java.lang.IllegalArgumentException: cannot add to layout: constraint must be a string (or null) 
    at java.awt.BorderLayout.addLayoutComponent(BorderLayout.java:426) 
    at javax.swing.JRootPane$1.addLayoutComponent(JRootPane.java:531) 
    at java.awt.Container.addImpl(Container.java:1120) 
    at java.awt.Container.add(Container.java:998) 
    at javax.swing.JFrame.addImpl(JFrame.java:562) 
    at java.awt.Container.add(Container.java:966) 
    at OffsetGrid.main(OffsetGrid.java:38) 

請幫我找出問題,並得到它的工作。謝謝

編輯:我仍然對如何使用gridbagconstraints感到困惑,所以我甚至不知道gridy和gridx是否適合在這裏使用。或者即使我應該使用gridbagconstraints。請提供任何建議以完成工作。謝謝

編輯:這似乎工作。

import java.awt.GridLayout; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.Insets; 
public class OffsetGrid { 

    public static void main (String [] args){ 
     JFrame Frame = new JFrame(); 
     Frame.setLayout(new GridBagLayout()); 
     Frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     GridLayout grid= new GridLayout(); 


     GridBagConstraints gbca= new GridBagConstraints(); 
     GridBagConstraints gbcb= new GridBagConstraints(); 
     JPanel[] panel=new JPanel[20]; 


     for (int row=0;row<20; row++){ 
       panel[row]=new JPanel(new GridBagLayout()); 
       gbca.insets=new Insets(0,100,0,0); 
       gbca.gridy=row; 
       gbcb.insets=new Insets(0,0,0,0); 
       gbcb.gridy=row; 

     for (int y=0; y<40;y++){ 
       grid=new GridLayout(1,40); 
       panel[row].setLayout(grid); 
       JButton[] button = new JButton[40]; 
       button[y]=new JButton(); 
       button[y].setOpaque(true); 
       panel[row].add(button[y]); 

       } 
      if (row%2==0){ 
       Frame.add(panel[row], gbcb); 
      } 
      else { 
       Frame.add(panel[row], gbca); 
      } 

    } 

     Frame.setVisible(true); 
     Frame.setLocationRelativeTo(null); 
     Frame.pack(); 
} 
} 
+0

不,我正在使用gridbaglayout。或試圖。此外,這個問題沒有一個完整的答案,可以幫助我。 – user2278269 2013-05-12 06:22:58

+0

將圖片發佈到imgur然後讓我知道我會爲你嵌入它。 – 2013-05-12 06:28:40

+0

你應該利用'panel [n]'的限制,而不是'Frame'。 (你也應該爲變量名使用正確的約定,並將其命名爲'JFrame frame''不是'JFrame Frame'。) – 2013-05-12 06:31:22

回答

6

你這樣做:

Frame.add(panel[row], gbcb); 

但是你忘了設置幀的佈局:

JFrame Frame = new JFrame(); 
Frame.setLayout(new GridBagLayout()); 

現在沒有拋出異常。然而......

Outcome

我不知道這是否是你想要什麼:

My effort

我做的情況下,一些改變我的代碼,用戶調整窗口。你仍然可以找到revision

import static javax.swing.BorderFactory.createEmptyBorder; 
import java.awt.GridLayout; 
import java.awt.event.*; 

import javax.swing.*; 

public class OffsetGrid { 
    public static final int ROWS = 10; 
    public static final int COLUMNS = 10; 

    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 
     frame.setLayout(new GridLayout(ROWS, 1)); 
     final JPanel[] panel = new JPanel[ROWS]; 
     final JButton[][] button = new JButton[ROWS][COLUMNS]; 
     for (int row = 0; row < ROWS; row++) { 
      panel[row] = new JPanel(new GridLayout(1, COLUMNS)); 
      for (int y = 0; y < COLUMNS; y++) { 
       button[row][y] = new JButton(row + "-" + y); 
       button[row][y].setOpaque(true); 
       panel[row].add(button[row][y]); 
      } 
      int padding = button[row][0].getPreferredSize().width/2; 
      if (row % 2 == 0) 
       panel[row].setBorder(createEmptyBorder(0, 0, 0, padding)); 
      else 
       panel[row].setBorder(createEmptyBorder(0, padding, 0, 0)); 
      frame.add(panel[row]); 
     } 
     frame.addComponentListener(new ComponentAdapter() { 
      @Override 
      public void componentResized(ComponentEvent e) { 
       for (int row = 0; row < ROWS; row++) { 
        int padding = button[row][0].getSize().width/2; 
        panel[row].setBorder(createEmptyBorder(0, 0, 0, padding)); 
        if (++row == ROWS) 
         break; 
        padding = button[row][0].getSize().width/2; 
        panel[row].setBorder(createEmptyBorder(0, padding, 0, 0)); 
       } 
      } 
     }); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 
+0

這完全是我想要的感謝。 – user2278269 2013-05-12 06:50:42

+0

謝謝。我也想出瞭如何讓它看起來正確與gridbag(代碼添加到問題),但這種方式似乎更好。再次感謝 – user2278269 2013-05-12 07:03:45

+0

最後一件事。這應該在一行中的按鈕之間添加填充,對吧? frame.setLayout(new GridLayout(ROWS,1,10,0));爲什麼不呢? (vs frame.setLayout(new GridLayout(ROWS,1)); – user2278269 2013-05-12 07:17:23

相關問題