2012-12-19 13 views
5

Powiel możliwe:
java - How would I dynamically add swing component to gui on click?Java dodać przyciski dynamicznie jako tablica

chcę dodać szereg przycisków dynamicznie. Próbowałem tak:

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

ale nie dostał nic, czego nie robię błąd?

Edit

Mam JFrame klasy „wybory” na nim mam przycisk, po naciśnięciu przycisku, to ma się wydarzyć:

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

potem idę do klasy gry (również klasy JFrame) do setSetting funkcji i jest tak:

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

Jakie są 'Setting.length' i' width'? – irrelephant

+0

@irrelephant setting.length zwraca numer 8 –

Odpowiedz

3

Można użyć GridLayout dodać równych wysokość/szerokość przyciski:

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

i kod do obsługi przycisku powinno być:

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

Należy pamiętać, że można również przekazać obiekt Setting obiekt refer za pomocą konstruktora Game (gdy można dodawać widżety dynamicznie) zamiast wywoływać metodę setSetting.

+0

gdzie są komentarze? nie widzę, czy piszesz –

+0

Chciałbym zasugerować, że powinieneś przekazać 'settings' przez parametr konstruktora klasy' Game'. – adatapost

+0

proszę zobaczyć kod z tego miejsca, jest on tylko w klasie Game i nazwałem go klasą wyboru, jest to bardzo proste http://www.mediafire.com/download.php?96cj26hlxb7nxl4 –

1

zgaduję że this EXTENS czy jest jakiś rodzaj ramki?

Pierwszym krokiem jest spakowanie ramki, wykonując this.pack();, ustawiając rozmiar ramki ti tylko dla wszystkich obiektów.

Zakładam, że ustawiłeś widoczność?

Teraz powinieneś być w stanie zobaczyć przyciski. Jeśli chcesz inny układ używać panel.setLayout(new SomeLayout);

+0

'this' to jFrame, próbowałem tak jak powiedziałeś (patrz edytowany kod) i nadal nie masz niczego –

2

jest już pod kontrolą menedżera układu, ustawienie rozmiaru i położenia przycisków jest nieistotne, ponieważ zmienią się po zatwierdzeniu panelu.

spróbować, zamiast, dodając panel Po zaludnionych go z przyciskami ..

na bieżąco z przykładu

Bez dalszych dowodów, jesteśmy tylko zgadywać ... Masz teraz dwie osoby którzy nie mają problemów.

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

Zrobiłem to, co powiedziałeś, ale nadal nie masz nic :(:( –

+1

Twój problem jest gdzieś, gdzie musisz udostępnić więcej kodu. Musisz podać [SSCCE] (http://sscce.org) /), które możemy uruchomić, demonstruje konkretny problem, z którym się mierzysz. – MadProgrammer

+0

kod, który podałem u, to cały mój kod, tak naprawdę to tylko jFrame, i próbowałem wydrukować coś w pętli, robi to pętla pracując –

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

setBound metoda

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

Dodałem to, co powiedziałeś po 'panel.add (b);' ale nadal masz othing; ( –

Powiązane problemy