-1

JTextField に注目し続ける必要があります。アプリケーションは Swing ライブラリを使用します。フォーカスを他のコンポーネントに変更するユーザーのミスを避けるために、時々そのフィールドにフォーカスを設定する必要があります。SwingWorker を使用する必要があると思います。フォーカスの設定は Swing コンポーネントの操作であるため、EDT で呼び出す必要があります。私の質問は、それを行うために SwingWorker を書く方法ですか? done() メソッドが EDT で呼び出されるタスクを渡すことはわかっていますが、このタスクを 2 秒ごとに呼び出す必要があります。メソッド done() は 1 回呼び出されます。だから多分このようなsthは大丈夫でしょうか?

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;
  }
});
}}

編集:

EDT で呼び出されるため、SwingWorker の一部であるメソッド process() が適切である可能性があることに気付きました。よくわかりませんが、このメソッドは、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();
    }
}
4

2 に答える 2

1

javax.swing.Timerの代わりに使用しSwingWorkerます。この場合actionPerformed、EDT で実行されます。また、コンポーネントにフォーカスを設定するには、 を呼び出す必要がありますrequestFocus。名前が示すように、これは要求のみであり、保証されません。したがって、アプローチを変更することができます。

Timer timer = new Timer(2000, new ActionListener()
{
    @Override
    public void actionPerformed(ActionEvent e)
    {
        codeBar.requestFocus();
    }
});

timer.setRepeats(true);
timer.start();
于 2014-07-19T19:48:52.057 に答える