Ciao ragazzi, ho un problema molto strano con le swing di java.
Ho un codice semplicissimo, lo trovate alla fine del post (potete compilarlo ed eseguirlo senza problemi).
Voglio creare una classe che gestisca un JFrame e il suo ciclo di vita.
Questa classe avrà i metodi:
onCreate() - Le componenti grafiche vengono inizializzate;
onShow() - Le componenti grafiche vengono tutte rese visibili e correttamente renderizzate.
Ora, il metodo onCreate viene chiamato dal costruttore della mia classe, tramite una
invokeAndWait per garantire l'esecuzione del codice nell'EDT. Nel metodo onCreate, viene impostato un componentListener sul JFrame da gestire, il quale ha il metodo
componentShown, che serve per indicare che tutto è stato mostrato ed è visibile. In questo metodo, quindi, viene effettuata la chiamata al metodo onShow().
Sappiamo che un JFrame non è visibile finché non viene richiesto esplicitamente (frame.setVisible(true). E quindi ho aggiunto il metodo "show" che fa appunto questo, sempre eseguendo il codice nell'EDT.
ora il
PROBLEMA: Il messaggio "SHOWN AND VALID" non viene mai eseguito.
Sapete dirmi perché? So che comunque nel disegnare gli elementi, il sistema operativo si prende del tempo, ed ecco perché ho voluto usare la callback
componentShown per garantire che il metodo onShow sia chiamato quando tutto è stato effettivamente disegnato.
Attualmente, usare le JavaFX non è un'opzione, per tanto ho bisogno di continuare usando questa strategia.
Vi ringrazio in anticipo!
Ecco il codice:
import java.awt.EventQueue;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.lang.reflect.InvocationTargetException;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
public class TEST {
private JFrame frame;
private JScrollPane contentPane;
private JPanel contentViewport;
private JScrollPane fragmentContentPane;
private JPanel fragmentContentViewport;
public TEST() throws InvocationTargetException, InterruptedException{
SwingUtilities.invokeAndWait(new Runnable(){
public void run(){
onCreate();
}
});
}
public void onCreate(){
System.out.println("On create! EDT: "+EventQueue.isDispatchThread());
frame=new JFrame();
contentPane=new JScrollPane();
contentViewport=new JPanel();
contentPane.setViewportView(contentViewport);
frame.setContentPane(contentPane);
frame.addComponentListener(new ComponentAdapter(){
public void componentShown(ComponentEvent e){
onShow();
}
});
}
public void onShow(){
System.out.println("On show! EDT: "+EventQueue.isDispatchThread());
fragmentContentViewport=new JPanel();
fragmentContentPane=new JScrollPane(fragmentContentViewport);
fragmentContentPane.addComponentListener(new ComponentAdapter(){
public void componentShown(ComponentEvent e){
if (e.getComponent().isValid()) System.out.println("SHOWN AND VALID!");
}
});
contentViewport.add(fragmentContentPane);
}
public void show() throws InvocationTargetException, InterruptedException{
SwingUtilities.invokeAndWait(new Runnable(){
public void run(){
System.out.println("Showing..");
frame.setVisible(true);
}
});
}
public static final void main(String[] args) throws InvocationTargetException, InterruptedException{
TEST t=new TEST();
t.show();
}
}