0

Swing から JTextComponent を装飾するクラスがあります。含まれているメソッドはどのスレッドからでも呼び出すことができるため、JTextComponent で動作するコードが AWT スレッドによって実行されるようにする必要があります。

2 番目の要件は、AWT スレッドがタスクを処理するまで、メソッド全体を呼び出すスレッドが「待機」することです。

public String getSelectedText() {
        Callable c = new Callable() {
            @Override
            public Object call() throws Exception {
                if (area.getSelectedText() == null) {
                    return "";
                }
                return area.getSelectedText();
            }
        };

        if (Thread.currentThread().getName().contains("AWT")) {
            return (String)c.call();
        }
        else {
            FutureTask task = new FutureTask(c);

            SwingUtilities.invokeLater(task);

            while (!task.isDone()) {
                //waiting
            }
            try {
                return (String)task.get();
            }
            catch (InterruptedException | ExecutionException ex) {
                return "";
            }
        }
    }

コードはうまく機能していますが、まだ 1 つの問題があります。私のクラスを使用したい人が AWT スレッドの名前を変更すると、デッドロックに陥ります。

AWT スレッドを明確に識別し、この問題を回避する方法はありますか?

ありがとうございました

4

2 に答える 2

3

名前をテストする代わりに、スレッドがイベント ディスパッチ スレッドであるかどうかを確認する必要があります。

if (EventQueue.isDispatchThread()) {
    // do stuff...
}

AWT を使用している場合でも、呼び出すこともできることに注意してください。

if (SwingUtilities.isEventDispatchThread()) {
    // do stuff...
}

まったく同じものを取得します。

于 2014-02-20T20:20:33.543 に答える