当我按下按钮时,我想在执行方法之前在JTextArea中显示文本。我使用jTextArea.append()和jTextArea.settext()但文本在方法执行后出现。我的代码:
//...JTextArea jTextArea;
JButton btnGo = new JButton("Start");
btnGo.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
jTextArea.append("line before\n");
myMethodFromOtherClass();
jTextArea.append("line after\n");
}
}
任何消化?
答案 0 :(得分:2)
ActionPerformed()方法由EDT(事件调度程序线程)调度,该线程处理所有与GUI相关的事件。在actionPerformed()
方法完成执行之前,不会更新在方法中执行的更新。要解决此问题,请在另一个线程中执行myMethodFromOtherClass()
,并在方法在第二个线程中完成执行后,仅对最终更新事件(jTextArea.append("line after\n");
)进行排队。
对此的粗略示范如下所示:
JButton btnGo = new JButton("Start");
btnGo.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
//Leave this here
jTextArea.append("line before\n");
//Create new thread to start method in
Thread t = new Thread(new Runnable(){
public void run(){
myMethodFromOtherClass();
//Queue the final append in the EDT's event queue
SwingUtilities.invokeLater(new Runnable(){
public void run(){
jTextArea.append("line after\n");
}
});
}
});
//Start the thread
t.start();
}
}
如果设计出更优雅的解决方案,请查看基于非常类似的程序但具有更多高级功能的SwingWorker。