
Originariamente inviata da
giannino1995
forse vedendo un esempio pratico potrei adattare la logica al mio codice ma diversamente non saprei proprio come fare.
Questo "dovrebbe" bastarti:
codice:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class UIDinamicaFrame extends JFrame {
private JTextField numTextField;
private JPanel buttonsPanel;
private JButton[] buttons = new JButton[0];
public UIDinamicaFrame() {
super("UI Dinamica");
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setSize(300, 250);
numTextField = new JTextField();
numTextField.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
generaPulsanti();
}
});
buttonsPanel = new JPanel(new GridLayout(0, 1));
JPanel containerPanel = new JPanel(new BorderLayout());
containerPanel.add(buttonsPanel, BorderLayout.NORTH);
JScrollPane scrollPane = new JScrollPane(containerPanel);
getContentPane().add(numTextField, BorderLayout.NORTH);
getContentPane().add(scrollPane, BorderLayout.CENTER);
}
private void generaPulsanti() {
int num;
try {
num = Integer.parseInt(numTextField.getText());
} catch (NumberFormatException nfe) {
// TODO errore (non importante ai fini dell'esempio sul layout)
return;
}
if (num < 0) {
// TODO errore (non importante ai fini dell'esempio sul layout)
return;
}
buttons = new JButton[num];
buttonsPanel.removeAll();
for (int i = 0; i < buttons.length; i++) {
buttons[i] = new JButton("B" + (i+1));
buttonsPanel.add(buttons[i]);
}
buttonsPanel.revalidate();
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new UIDinamicaFrame().setVisible(true);
}
});
}
}
E se vuoi "capire" bene le cose, cerca di capire 2 aspetti particolari nel codice che ho scritto:
a) Perché nel JScrollPane ho inserito containerPanel (che ha buttonsPanel in NORTH) e non direttamente buttonsPanel. C'è un motivo particolare per cui l'ho fatto. Più che altro per questioni "estetiche". Prova a mettere nel JScrollPane direttamente buttonsPanel e prova la differenza tra i due modi con tanti e pochi pulsanti. Entrambi i modi sono tecnicamente corretti ma il risultato estetico varia. Dipende cosa si vuole ottenere e/o piace ....
b) Perché dopo le aggiunte nel pannello ho usato revalidate() invece che solo validate(). Anche qui c'è un motivo ben preciso che riguarda esclusivamente il fatto che il pannello che modifico è contenuto dentro il JScrollPane (direttamente o indirettamente, a seconda di a) ma non è questo importante). Prova ad usare validate() e a cambiare il numero.