1

Applet クラスを拡張して最初に作成したコードを複製しようとしています。ただし、以下のコードは a に対して常に true ですFrameisShowing()FrameisVisible()も trueの場合、常に true を返すことを理解しています。setVisible()が明示的に false に設定されていない限り、isShowing()true を返します。

私の目標は、アプリケーション フレームが最小化されたときにデーモン スレッドがループしないようにすることです。

public class Screen extends Applet{

@Override
public void init() {

    addComponentListener(new ComponentAdapter() {

        @Override
        public void componentShown(ComponentEvent e) {
            //do stuff

        }

        @Override
        public void componentHidden(ComponentEvent e) {
            //Stop doing stuff
        }       
    });
}

提案の実施 (Boris Pavlović)

public class Screen extends Frame implements Runnable{

private boolean runL;
private Thread thread;

public Screen() {
    setSize(256,256);
    setVisible(true);

    addWindowFocusListener(new WindowAdapter() {

        @Override
        public void windowGainedFocus(WindowEvent e) {
            runL = true;
            starThread();
        }

        @Override
        public void windowLostFocus(WindowEvent e) {
            runL = false;
        }

    });

}


@Override
public void run() {
    while(runL){System.out.println("showing");}
}

private void starThread(){
    if(thread == null){
        thread = new Thread(this);
        thread.start();
    } else if(!thread.isAlive()){
        thread = new Thread(this);
        thread.start();
    }

}
4

2 に答える 2

1

「フォーカスサブシステムの使用方法」のチュートリアルを確認してください。WindowsAdapter計算を開始/停止するために使用できるさまざまな状態遷移をオーバーライドできます。

于 2012-08-23T08:53:42.330 に答える
0

私の目標は、アプリケーション フレームが最小化されたときにデーモン スレッドがループしないようにすることです。

a を追加し、WindowListenerで計算を停止しますwindowIconified(WindowEvent)

于 2012-08-23T09:19:50.187 に答える