2012-12-19 5 views
5

Mögliche Duplizieren:
java - How would I dynamically add swing component to gui on click?Java Schaltflächen hinzufügen dynamisch als Array

Ich möchte dynamisch Array von Schaltflächen hinzuzufügen. Ich habe versucht, dies wie:

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); 
     } 
    } 

aber nichts bekommen, was Fehler habe ich machen?

bearbeiten

Ich habe JFrame Klasse „Auswahl“ an i einen Knopf haben, wenn ich die Taste drücken, wird dies geschehen soll:

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(); 
    } 

dann gehen Sie auf die Spielklasse i (auch JFrame Klasse) an die Funktion setSetting und es ist so:

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; 
} 
+1

Was sind 'Setting.length' und' width'? – irrelephant

+0

@irrelephant setting.length returns Nummer 8 –

Antwort

3

Sie können GridLayout verwenden, um die gleiche Höhe/Breite Schaltflächen hinzufügen verwenden möchten:

enter image description here

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); 
    } 
} 

und Code in Schaltfläche Handler sollte sein:

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

Beachten Sie, dass Sie auch Setting Object Reference übergeben können Ence über Game Konstruktor (wenn Sie Widgets dynamisch hinzufügen können) statt Aufruf setSetting Methode.

+0

wo sind die Kommentare? Ich kann nicht sehen, ob Sie schreiben –

+0

Ich würde vorschlagen, dass Sie "Einstellungen" über Konstruktor Parameter der 'Game' Klasse übergeben sollten. – adatapost

+0

Bitte sehen Sie den Code von hier, es ist nur auf Spielklasse, und ich rief es aus der Auswahlklasse, es ist sehr einfach http://www.mediafire.com/download.php?96cj26hlxb7nxl4 –

1

ich vermute, dass this extens oder ist eine Art Rahmen?

Der erste Schritt besteht darin, den Rahmen zu packen, indem this.pack(); setzt die Rahmengröße ti passt nur für alle Objekte.

Ich nehme an, Sie haben es sichtbar gemacht?

Jetzt sollten Sie in der Lage sein, die Tasten zu sehen. Wenn Sie ein anderes Layout panel.setLayout(new SomeLayout);

+0

'this' ist jFrame, ich habe versucht, wie Sie sagten (siehe den bearbeiteten Code) und immer noch nichts –

2

Die JPanel ist bereits unter der Kontrolle eines Layout-Managers, die Einstellung der Größe und Position der Schaltflächen ist irrelevant, da sie sich ändern, sobald das Panel validiert ist.

Versuch, stattdessen Hinzufügen der Platte, nachdem Sie es mit den Tasten bestückt haben ..

Beispiel AKTUALISIERT

Ohne weitere Beweise sind wir nur raten ... Sie haben nun zwei Personen die keine Probleme haben.

enter image description here

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() { 
     } 
    } 
} 
+0

Ich tat, was Sie sagten, aber immer noch nichts :(:( –

+1

Dann ist Ihr Problem wo sonst, müssen Sie mehr Code teilen. Sie müssen eine [SSCCE] (http://sscce.org /) was wir ausführen können, demonstriert das besondere Problem, dem Sie gegenüberstehen. – MadProgrammer

+0

der Code, den ich Ihnen gab, ist mein Code, wirklich ist es nur ein jFrame, und ich habe versucht, etwas auf der Schleife zu drucken, tut es so die Schleife ist arbeiten –

1
Try to use setBounds(x,y,width,heigth) method 

setBound Methode

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() 
+0

ich fügte hinzu, was Sie nach 'panel.add (b) sagten;' aber haben noch n nichts (; –