0

このエラーを調査しましたが、解決策が見つからないようです。40 列 20 行の 800 個の JButton のグリッドを作成しようとしています。これは最終的に、私が作っているドミノ倒しロボットをセットアップするドミノを制御するために使用されます。GridLayout を使用してグリッドを作成しましたが、プロジェクトの性質上、1 行おきにボタンの半分だけオフセットさせたいと考えています。これは、コンピューターのキーボードのキーがどのように設定されているかを意味します。(私が説明しようとしていることに役立つ写真を追加したかったのですが、どうやら物事を説明するのに苦労している初心者は写真を追加することを許可されていないようです).

panel と呼ばれる 20 個のパネルの JPanel 配列を作成することで、これを実行しようとしています。次に、パネルに 40 個の JButton を追加します。次に、GridBagConstraints を使用して 1 行おきにオフセットします。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();
}
}
4

1 に答える 1

7

あなたはこれをしました:

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

しかし、フレームのレイアウトを設定するのを忘れていました:

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

現在、例外はスローされません。でも......

結果

これがあなたが望むものかどうか疑問に思います:

私の努力

ユーザーがウィンドウのサイズを変更した場合に備えて、コードにいくつかの変更を加えました。リビジョンで古いコードを見つけることができます

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);
    }
}
于 2013-05-12T06:48:16.153 に答える