EventQueue?とは? †
- Swingは、シングルスレッドで動いている
- GUIコンポーネントを他のスレッドから操作する場合には、EventQueue? にタスクを追加する
サンプル †
package com.snail.javaexam;
import java.lang.reflect.InvocationTargetException;
import java.util.logging.Level;
import java.util.logging.Logger;
public class EventQueueExam extends javax.swing.JFrame {
/** Creates new form EventQueueExam */
public EventQueueExam() {
initComponents();
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
※ GENERATED CODE ※
}// </editor-fold>
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
jTextArea1.setText(jTextArea1.getText() + "hello\n");
}
});
}
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new EventQueueExam().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JButton jButton1;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTextArea jTextArea1;
// End of variables declaration
}
EventQueue?の使い方 †
- EventQueue?.invokeLater(Runnable)
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
jTextArea1.setText(jTextArea1.getText() + "hello\n");
}
});
}
- EventQueue? の最後に積み込む
- EventQueue?.invokeLater(Runnable) 自体は EventQueue? に積み込んだ時点で終了する
- EventQueue?.invokeAndWait?(Runnable)
try {
java.awt.EventQueue.invokeAndWait(new Runnable() {
@Override
public void run() {
doSomething()
}
});
} catch (InterruptedException ex) {
Logger.getLogger(EventQueueExam.class.getName()).log(Level.SEVERE, null, ex);
} catch (InvocationTargetException ex) {
Logger.getLogger(EventQueueExam.class.getName()).log(Level.SEVERE, null, ex);
}
- EventQueue? の最初に積み込む
- EventQueue?.invokeAndWait?(Runnable) は、処理が終了するまでブロックされる
- EventQueue?.invokeAndWait?(Runnable) は、Event処理内では実行できない。
- jButton1ActionPerformed?() の中で invokeAndWait?() をするとエラーになる。
- jButton1ActionPerformed?() 自体が、EventQueue? に積み込まれているタスクだから、そのスレッドの中でさらに最優先のタスクを EventQueue? に積み込んで終了を待つとデッドロックになる。
SwingUtility?.invokeLater() は、内部的に EventQueue?.invokeLater() を呼んでいる。同じ物。 †
Java#GUI