5

重複の可能性:
java - クリック時にスイング コンポーネントを GUI に動的に追加するにはどうすればよいですか?

ボタンの配列を動的に追加したい。私はこのように試しました:

this.pack();
    Panel panel = new Panel();
    panel.setLayout(new FlowLayout());
    this.add(panel);
    panel.setVisible(true);
    for (int i = 0; i < Setting.length; i++) {
        for (int j = 0; j < Setting.width; j++) {
            JButton b = new JButton(i+"");
            b.setSize(30, 30);
            b.setLocation(i * 30, j * 30);
            panel.add(b);
            b.setVisible(true);
        }
    }

しかし、何も得られませんでした。どのような間違いを犯しましたか?

編集

jFrame クラスの「選択肢」があり、ボタンがあります。ボタンを押すと、次のようになります。

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
       structure.Setting s = new Setting(8, 8, 3, 1, 1);
       Game g = new Game();
       g.setSetting(s);
       this.dispose();
       g.show();
    }

次に、関数 setSetting の Game クラス (jFrame クラスも) に移動すると、次のようになります。

void setSetting(Setting s) {
        this.setting = s;
        structure.Game game = new structure.Game(setting);
        JPanel panel = new JPanel(new GridLayout(5, 5, 4, 4));
        for (int i = 1; i <= 5; i++) {
            for (int j = 1; j <= 5; j++) {
                JButton b = new JButton(String.valueOf(i));
                panel.add(b);
            }
        }
        add(panel);
        pack();
        setVisible(true);
    }
    structure.Setting setting;
}
4

4 に答える 4

3

GridLayoutを使用して、同じ高さ/幅のボタンを追加できます。

ここに画像の説明を入力

public class Game extends JFrame {
    private JPanel panel;
    public Game(int rows,int cols,int hgap,int vgap){
        panel=new JPanel(new GridLayout(rows, cols, hgap, vgap));
        for(int i=1;i<=rows;i++)
        {
            for(int j=1;j<=cols;j++)
            {
                JButton btn=new JButton(String.valueOf(i));
                panel.add(btn);
            }
        }
        add(panel);
        pack();
        setVisible(true);
    }
}

ボタンのハンドラーのコードは次のようになります。

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
   Game g = new Game(5,5,3,3);
}

Settingメソッドを呼び出す代わりに、コンストラクターを介してオブジェクト参照を渡すこともできることに注意してくださいGame(ウィジェットを動的に追加する場合) setSetting

于 2012-12-19T06:18:38.377 に答える
2

JPanel既にレイアウト マネージャーの制御下にあり、パネルが検証されると変更されるため、ボタンのサイズと位置の設定は無関係です。

代わりに、ボタンを配置した後にパネルを追加してみてください。

例で更新

これ以上の証拠がないので、私たちは推測にすぎません...あなたは今、問題のない 2 人を持っています。

ここに画像の説明を入力

Panel panel = new Panel();
for (int i = 0; i < Setting.length; i++) {
    for (int j = 0; j < Setting.width; j++) {
        jButton b = new jButton(i + "");
        panel.add(b);
    }
}
this.add(panel);

public class BadBoy {

    public static void main(String[] args) {
        new BadBoy();
    }

    public BadBoy() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());

                int buttonCount = (int) Math.round(Math.random() * 20);
                int columnCount = (int) Math.round(Math.random() * 20);
                JPanel buttonPane = new JPanel(new GridLayout(0, columnCount));
                for (int i = 0; i < buttonCount; i++) {
                    JButton b = new JButton(i + "");
                    buttonPane.add(b);
                }

                frame.add(buttonPane);

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

    public class ButtonPane extends JPanel {

        public ButtonPane() {
        }
    }
}
于 2012-12-19T06:19:39.317 に答える
1

私はそれが拡張されていると推測していますか、thisそれともある種のフレームですか?

this.pack();最初のステップは、すべてのオブジェクトにちょうど合うようにフレーム サイズを設定して、フレームをパックすることです。

見えるように設定したと思いますか?

これで、ボタンが表示されるはずです。別のレイアウトを使用する場合panel.setLayout(new SomeLayout);

于 2012-12-19T06:17:07.973 に答える
1
Try to use setBounds(x,y,width,heigth) method

setBoundメソッド

for (int i = 0; i < 1; i++) {
                for (int j = 0; j <1; j++) {
                    JButton b = new JButton("button");
                    b.setBounds(500, 500, 100, 20);               
                    this.add(b);

               }
            }


this.repaint();
this.validate()
于 2012-12-19T06:19:56.050 に答える