作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我按下按钮时,我想在执行方法之前在 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");
}
}
有什么建议吗?
最佳答案
actionPerformed() 方法由处理所有 GUI 相关事件的 EDT(事件调度程序线程)调度。在 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它基于非常相似的过程,但具有更高级的功能。
关于java - 如何在 jtextarea 上 append 文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21649981/
我是一名优秀的程序员,十分优秀!