【发布时间】:2014-07-19 17:52:10
【问题描述】:
我需要继续关注 JTextField。应用程序使用 Swing 库。我需要不时关注该领域,以避免将焦点转移到其他组件的用户错误。我想我需要使用 SwingWorker。设置焦点是 Swing 上的一个操作 组件,因此应该在 EDT 中调用它。我的问题是如何编写 SwingWorker 来做到这一点? 我知道方法 done() 传递要在 EDT 中调用的任务,但我需要每隔 2 秒调用一次此任务。方法 done() 被调用一次。 那么这样的事情可能会好吗?
public class myWorker extends SwingWorker<Void, Void> {
@Override
protected Void doInBackground() throws Exception {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
//here set focus on JTextField
return null;
}
});
}}
编辑:
我注意到作为 SwingWorker 一部分的方法 process() 可能是合适的,因为它是在 EDT 中调用的。我不确定,但是当我调用 publish() 方法时,可能总是会调用此方法。那么你能告诉我这段代码是否可以有效地完成这项任务吗?
private class KeepFocusWorker extends SwingWorker<Void, Void>
{
@Override
protected Void doInBackground() throws Exception
{
while(true)
{
publish();
}
}
@Override
protected void process(List<Void> chunks)
{
codeBar.requestFocusInWindow();
}
}
【问题讨论】:
-
“所以也许……” ..西斯?南?懒惰?键入单词的所有字母,而不是让人们猜测。
-
Focus 是用户的指南。与其推测一个糟糕的解决方案,不如解释你想要完成什么以及你尝试过什么。另请参阅How to Use Swing Timers。
-
好的。我编辑了我的帖子以使其更清晰。
标签: java multithreading swing swingworker swingutilities