J'ai vraiment beaucoup de mal à comprendre le concept d'EDT.

Je n'arrive pas à placer correctement un écouteur qui customise l'action de fermer la fenêtre principale et quitter le programme. Quoique je fasse, j'ai cette exception :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
Exception in thread "AWT-EventQueue-0" java.lang.Error: Cannot call invokeAndWait from the event dispatcher thread
Je pensais que justement, appeler SwingUtilities.invokeAndWait ou SwingUtilities.invokeLater permettait d'obtenir des applications thread safe ...

Voici mon architecture :

DeviceManager est mon programme principal, c'est une classe statique, dans laquelle au sein du main, j'instancie ma classe WindowManager, et essaie de placer un écouteur sur l'évenement Closing, afin de pouvoir fermer facilement d'autres thread, dont j'ai les références ici, et que je n'aurais pas dans la classe windowManager.

Voici mon main :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
 
public static void main( String[] args )
{
	_window  = new WindowManager( "Les Tanukis : Java serial - socket daemon." );
 
	WindowListener wListener = new WindowAdapter()
	{
		public void windowClosing( WindowEvent e )
		{
			int confirm = JOptionPane.showOptionDialog( _window.get_mainFrame(), "Really Exit?", "Exit Confirmation",
					JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, null, null );
			if ( confirm == 0 )
			{
				try {
					SwingUtilities.invokeAndWait(
						new Runnable(){
							public void run(){
								_window.get_mainFrame().dispose();
							}
						}
					);
				} catch ( InterruptedException ee) {
					ee.printStackTrace();
				} catch ( InvocationTargetException eee) {
					eee.printStackTrace();
				}
 
				if( DeviceManager.getSocket() != null )
					DeviceManager.getSocket().closeConnection();
				if( DeviceManager.getSerialListener() != null )
					DeviceManager.getSerialListener().close();
				if( DeviceManager.getPrinter() != null ){
					PrinterManager pm = DeviceManager.getPrinter();
					pm = null;
				}
				System.exit(0);
			}
		}
	};
	_window.get_mainFrame().addWindowListener( wListener );
 
	_printer = new PrinterManager( _window );
 
        ...
Ce code lance une exception après avoir ouvert le JOptionPAne :

Exception in thread "AWT-EventQueue-0" java.lang.Error: Cannot call invokeAndWait from the event dispatcher thread

Voici le code de WindowManager, le constructeur :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
 
public WindowManager( String title ) throws HeadlessException
{
	try {
		javax.swing.SwingUtilities.invokeAndWait( 
			new Runnable() {
				public void run() {
			    	JFrame.setDefaultLookAndFeelDecorated(true);
					JDialog.setDefaultLookAndFeelDecorated(true);
 
					try {
						UIManager.setLookAndFeel(new SubstanceBusinessLookAndFeel() );
					}
					catch (UnsupportedLookAndFeelException e1){
						e1.printStackTrace();
					}
 
					_mainFrame.setDefaultCloseOperation( WindowConstants.DO_NOTHING_ON_CLOSE );
					_mainFrame.setSize(400, 300);
 
					try {
						set_icon( ImageIO.read( getClass().getResource("assets/1265388043_socket.png")));
					}
					catch ( IOException e ) {
						e.printStackTrace();
					}
 
					_mainFrame.setIconImage(get_icon());
					_mainFrame.setVisible(true);
 
					set_mainLayout( new GridBagLayout() );
 
					_mainFrame.setLayout( get_mainLayout() );
 
					set_mainTxtarea(new JTextArea());
 
					addComponent( _mainFrame, get_mainTxtarea(), 0, 0, 2, 3, GridBagConstraints.CENTER, GridBagConstraints.BOTH );
 
				}
			}
		);
	} catch (InterruptedException e1) {
		e1.printStackTrace();
	} catch (InvocationTargetException e1) {
		e1.printStackTrace();
	}
 
}
Quelqu'un pourrait il m'expliquer ce que je n'arrive pas à comprendre, c'est à dire à quoi sert exactement invokeAndWait, et pourquoi ce code n'est pas thread safe ...