Ciò che riscontri è il risultato di una race condition tra il Thread "main" ed il Thread "event dispatcher" di AWT/Swing. Affida la proiezione della finestra e le modifiche del componente visibile allo AWT Event Dispatcher e il flusso di esecuzione tornerà ad essere prevedibile.
Codice:
public class Main {
public static void main(String[] args) {
final Pannello pannello = new Pannello();
final Finestra finestra = new Finestra(pannello);
finestra.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
SwingUtilities.invokeLater(new Runnable() {
public void run() {
finestra.setVisible(true);
pannello.addBottoni();
finestra.repaint();
}
});
}
}