Salve a tutti, ho creato un programma di prova per cercare di capire come usare, appunto, il metodo invokeLater con le informazioni che sono riuscito a estrapolare da varie fonti in rete. Tuttavia non mi è ancora riuscito di capire DOVE chiamare il metodo invokeLater.
Posto il codice:
1.Questa classe (che contiene anche il main) è la sopraclasse di quella seguente: in sostanza, qui preparo lo schema base di una dialog con un pannello, con il titolo, in cima; un pannello centrale (chiamato panel) VUOTO in cui poter aggiungere, nelle sottoclassi, ciò che si desidera; un pannello con due JButton sul fondo.
codice:
public class JDialogSiNo extends JDialog{
private int WIDTH, HEIGHT, HEIGHTBASE;
private float rapporto;
private JLabel titolo;
private JPanel pantitle, panbutton, sfondo;
protected JPanel panel;
private JButton si, no;
private JFrame frame;
private Color background, line;
private GridBagLayout GBL;
private GridBagConstraints GBC;
public JDialogSiNo(JFrame f, String title, String yesButton, String noButton, int width, int height, int heightBase, float rapporto_heightBase_heightTitolo,Color backColor, Color lineColor){
WIDTH = width;
HEIGHT = height;
HEIGHTBASE = heightBase;
frame = f;
background = backColor;
line = lineColor;
rapporto = rapporto_heightBase_heightTitolo;
GBL = new GridBagLayout();
GBC = new GridBagConstraints();
sfondo = new JPanel();
pantitle = new JPanel();
panel = new JPanel();
panbutton = new JPanel();
titolo = new JLabel(title);
si = new JButton(yesButton);
no = new JButton(noButton);
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
posiziona_al_centro(frame);
setSize(WIDTH, HEIGHT);
setUndecorated(true);
setModal(true);
setBackground(background);
sfondo.setBackground(getBackground());
sfondo.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
sfondo.setLayout(GBL);
GBC.gridx = 0;
GBC.gridy = 0;
GBC.weightx = 1;
GBC.weighty = 1;
GBC.fill = GridBagConstraints.BOTH;
pantitle.setLayout(new GridBagLayout());
pantitle.setBackground(getBackground());
pantitle.setPreferredSize(titolo.getPreferredSize());
pantitle.setMinimumSize(titolo.getMinimumSize());
pantitle.setMaximumSize(titolo.getMaximumSize());
pantitle.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, line));
sfondo.add(pantitle, GBC);
GridBagConstraints gbc2 = new GridBagConstraints();
gbc2.gridx = 0;
gbc2.gridy = 0;
gbc2.fill = GridBagConstraints.BOTH;
titolo.setFont(new Font("Tahoma", Font.BOLD, 18));
titolo.setHorizontalAlignment(JLabel.CENTER);
titolo.setPreferredSize(new Dimension(WIDTH, (int)(HEIGHTBASE/rapporto)));
titolo.setMinimumSize(new Dimension(WIDTH, (int)(HEIGHTBASE/rapporto)));
titolo.setMaximumSize(new Dimension(WIDTH, (int)(HEIGHTBASE/rapporto)));
pantitle.add(titolo, gbc2);
GBC.gridx = 0;
GBC.gridy = 0;
GBC.weightx = 1;
GBC.weighty = 1;
GBC.fill = GridBagConstraints.BOTH;
pantitle.setBackground(getBackground());
pantitle.setPreferredSize(titolo.getPreferredSize());
pantitle.setMinimumSize(titolo.getMinimumSize());
pantitle.setMaximumSize(titolo.getMaximumSize());
pantitle.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, line));
sfondo.add(pantitle, GBC);
GBC.gridx = 0;
GBC.gridy = 1;
GBC.weightx = 1;
GBC.weighty = 1;
panel.setBackground(getBackground());
int heightPanel = HEIGHT - 2*(int)(HEIGHTBASE/rapporto);
panel.setPreferredSize(new Dimension(WIDTH, heightPanel));
panel.setMinimumSize(new Dimension(WIDTH, heightPanel));
sfondo.add(panel, GBC);
panbutton.setLayout(new GridLayout(0,2));
panbutton.setBackground(getBackground());
no.setBackground(getBackground());
no.setBorder(BorderFactory.createMatteBorder(1, 0, 0, 1, line));
panbutton.add(no);
si.setBackground(getBackground());
si.setBorder(BorderFactory.createMatteBorder(1, 0, 0, 0, line));
panbutton.add(si);
GBC.gridx = 0;
GBC.gridy = 2;
GBC.anchor = GridBagConstraints.SOUTH;
panbutton.setPreferredSize(new Dimension(WIDTH, (int)(HEIGHTBASE/rapporto)));
panbutton.setMinimumSize(new Dimension(WIDTH, (int)(HEIGHTBASE/rapporto)));
panbutton.setMaximumSize(new Dimension(WIDTH, (int)(HEIGHTBASE/rapporto)));
sfondo.add(panbutton, GBC);
add(sfondo);
// pack();
sfondo.setVisible(true);
setVisible(true);
}
});
}
public void posiziona_al_centro(JFrame f){
setLocation(f.getX()+((f.getWidth()-WIDTH)/2), f.getY()+((f.getHeight()-HEIGHT)/2));
}
public void posiziona_al_centro(JDialog d){
setLocation(d.getX()+((d.getWidth()-WIDTH)/2), d.getY()+((d.getHeight()-HEIGHT)/2));
}
public void posiziona_al_centro(JWindow w){
setLocation(w.getX()+((w.getWidth()-WIDTH)/2), w.getY()+((w.getHeight()-HEIGHT)/2));
}
public static void main(String[] arg0){
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(1200, 700);
f.setLocation(150, 100);
f.setVisible(true);
DialogNomiGiocatori d = DialogNomiGiocatori.crea(f, "ERRORE", "Vai", "Indietro", 300, 220, 5, Color.LIGHT_GRAY, Color.CYAN, 6);
// d.pack();
d.posiziona_al_centro(f);
}
public JPanel getPanel() {
return panel;
}
public JButton getYesButton(){
return si;
}
public JButton getNoButton(){
return no;
}
}
2. Questa invece è sottoclasse della classe JDialogSiNo (postata sopra): qui aggiungo un certo numero di righe label-textfield al panel centrale della classe madre.
codice:
public class DialogNomiGiocatori extends JDialogSiNo{
private static final String NOMI_GIOCATORI = "Inserisci i nomi dei giocatori";
private static int HEIGHT;
private String[] nomi;
private JLabel[] labels;
private JTextField[] textfields;
private int n_giocatori;
private GridBagLayout GBL;
private GridBagConstraints GBC;
private DialogNomiGiocatori(JFrame f, String title, String yesButton, String noButton, int width, int height, int heightBase, float rapporto_height_heightTitolo, Color back, Color lines, int n_giocat) {
super(f, title, yesButton, noButton, width, height, heightBase, rapporto_height_heightTitolo, back, lines);
n_giocatori = n_giocat;
// TODO Auto-generated method stub
nomi = new String[n_giocatori];
labels = new JLabel[n_giocatori];
textfields = new JTextField[n_giocatori];
GBL = new GridBagLayout();
GBC = new GridBagConstraints();
panel.setLayout(GBL);
GBC.anchor = GridBagConstraints.WEST;
GBC.gridx = 0;
GBC.gridwidth = 1;
GBC.insets.top = 2;
GBC.insets.bottom = 0;
GBC.weighty = 1;
GBC.insets.left = 7;
GBC.insets.right = GBC.insets.left;
for(int i=0; i<n_giocatori; i++){
labels[i] = new JLabel("Giocatore "+(i+1));
GBC.gridy = i;
panel.add(labels[i],GBC);
labels[i].setVisible(true);
}
GBC.gridx = 1;
GBC.weightx = 1;
GBC.fill = GridBagConstraints.HORIZONTAL;
for(int j=0; j<n_giocatori; j++){
textfields[j] = new JTextField();
GBC.gridy = j;
panel.add(textfields[j], GBC);
textfields[j].setVisible(true);
}
panel.setVisible(true);
}
public static DialogNomiGiocatori crea(JFrame f, String title, String yesButton, String noButton, int width, int heightBase, float rapporto_height_heightTitolo, Color back, Color lines, int n_giocatori){
float coeff = rapporto_height_heightTitolo/(rapporto_height_heightTitolo-2);
int gioc_che_ci_stanno = (int)((heightBase/coeff)/23);
if(n_giocatori<gioc_che_ci_stanno)
HEIGHT = heightBase;
else
HEIGHT = heightBase+21*(n_giocatori-gioc_che_ci_stanno+1);
return new DialogNomiGiocatori(f, title, yesButton, noButton, width, HEIGHT, heightBase, rapporto_height_heightTitolo, back, lines, n_giocatori);
}
}
Ora, nel codice riportato (che funziona correttamente), invokeLater è chiamato nel costruttore della CLASSE MADRE soltanto. Ho provato a chiamarlo anche nel costruttore della sottoclasse, ma in quel caso il panel centrale resta vuoto. Ho provato a chiamarlo SOLO nella sottoclasse, ma ancora nulla. Dunque non capisco: DOVE va chiamato (sto parlando più in generale, non solo per questo caso specifico) il metodo invokeLater?