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?