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 :
Je pensais que justement, appeler SwingUtilities.invokeAndWait ou SwingUtilities.invokeLater permettait d'obtenir des applications thread safe ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2Exception in thread "AWT-EventQueue-0" java.lang.Error: Cannot call invokeAndWait from the event dispatcher thread
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 :
Ce code lance une exception après avoir ouvert le JOptionPAne :
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 ); ...
Exception in thread "AWT-EventQueue-0" java.lang.Error: Cannot call invokeAndWait from the event dispatcher thread
Voici le code de WindowManager, le constructeur :
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 ...
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(); } }
Partager