Как проверить invokelater сделано
В приведенном ниже коде я хочу сделать что-то после того, как invokeLater будет сделано. 1) Я не могу использовать invokeAndWait из-за того, что setModel вызывается диспетчером. 2) Я не могу изменить значение конечной переменной внутри потока! тогда как я могу ждать, пока involeLater будет сделано в первую очередь?
boolean isDone=false;
SwingUtilities.invokeLater(new Runnable(){public void run(){
setModel(new DefaultTableModel(oRecordTable, sIP_TABLE_COL_NAMES_LIST));
isDone = true; // CAN NOT BE CHANGED HERE, AS HAS TO BE FINAL
}});
while (!idDone){
//wait
}
// do something here after the invokeLater is done
1 ответ
Вы можете сделать это, используя CountDownLatch. НО это будет точно так же, как при использовании invokeAndWait(), блокирующей текущий поток, так что это не имеет никакого смысла.
правильный:
SwingUtilities.invokeLater(new Runnable(){public void run(){
setModel(new DefaultTableModel(oRecordTable, sIP_TABLE_COL_NAMES_LIST));
isDone = true; // CAN NOT BE CHANGED HERE, AS HAS TO BE FINAL
// do something here after the invokeLater is done <=====
}});
CountDownLatch (бесполезно, см. Выше)
final CountDownLatch latch = new CountDownLatch(1);
SwingUtilities.invokeLater(new Runnable(){public void run(){
setModel(new DefaultTableModel(oRecordTable, sIP_TABLE_COL_NAMES_LIST));
isDone = true; // CAN NOT BE CHANGED HERE, AS HAS TO BE FINAL
latch.countDown();
}});
latch.await(); // could use invokeAndWait as well if blocking thread here ..