我研究了這個錯誤,我似乎無法找到解決方案。我正在嘗試創建一個包含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();
}
}
不,我正在使用gridbaglayout。或試圖。此外,這個問題沒有一個完整的答案,可以幫助我。 – user2278269 2013-05-12 06:22:58
將圖片發佈到imgur然後讓我知道我會爲你嵌入它。 – 2013-05-12 06:28:40
你應該利用'panel [n]'的限制,而不是'Frame'。 (你也應該爲變量名使用正確的約定,並將其命名爲'JFrame frame''不是'JFrame Frame'。) – 2013-05-12 06:31:22