1

ユーザーが非アクティブになった後にJFrameを閉じるにはどうすればよいですか?

これまでのところ、

Thread.sleep(10000);

誰かがこれを行うためのコードを教えていただければ幸いです。

Java は初めてで、システムのセキュリティについて詳しく知りたい

4

2 に答える 2

4

これは、 を使用した Braj のアイデアの例ですjavax.swing.Timer

イベント間の時間を監視する必要がなく、タイマーがトリガーされたときにイベントがイベントディスパッチスレッド内で確実に発生するため、プロセスが簡素化され、複雑さがさらに軽減されます。

AWTEvent.MOUSE_MOTION_EVENT_MASKまた、適切な測定のためにとAWTEvent.MOUSE_WHEEL_EVENT_MASKイベントを含めたことにも注意してください;)

import java.awt.AWTEvent;
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.Toolkit;
import java.awt.Window;
import java.awt.event.AWTEventListener;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class AutoClose {

    public static void main(String[] args) {
        new AutoClose();
    }

    private Timer timer;
    private JLabel label;
    private JFrame frame;

    public AutoClose() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                label = new JLabel("Waiting...");
                frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(label);
                frame.setSize(200, 200);
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);

                Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {

                    private int count;

                    @Override
                    public void eventDispatched(AWTEvent event) {
                        Object source = event.getSource();
                        if (source instanceof Component) {
                            Component comp = (Component) source;
                            Window win = null;
                            if (comp instanceof Window) {
                                win = (Window) comp;
                            } else {
                                win = SwingUtilities.windowForComponent(comp);
                            }
                            if (win == frame) {
                                timer.restart();
                                label.setText("Interrupted..." + (++count));
                            }
                        }
                    }
                }, AWTEvent.KEY_EVENT_MASK | AWTEvent.MOUSE_EVENT_MASK | AWTEvent.MOUSE_MOTION_EVENT_MASK | AWTEvent.MOUSE_WHEEL_EVENT_MASK);

                timer = new Timer(5000, new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        frame.dispose();
                    }
                });
                // You could use a WindowListener to start this
                timer.start();
            }
        });
    }

}
于 2014-04-08T23:54:41.293 に答える
3

これを試してみてください

手順:

  • キーイベントとマウスイベントをリッスンします。
  • チェックする新しいスレッドが開始されます。
  • 時間差が指定された時間 (以下のサンプル コードでは 10 秒) を超える場合は、ウィンドウを破棄します。
  • それで全部です。

サンプルコードは次のとおりです。

    private long time;

    ...

    long eventMask = AWTEvent.KEY_EVENT_MASK | AWTEvent.MOUSE_EVENT_MASK;

    Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {
        public void eventDispatched(AWTEvent e) {
            time = System.currentTimeMillis();
        }
    }, eventMask);

    time = System.currentTimeMillis();
    new Thread(new Runnable() {

        @Override
        public void run() {
            while (true) {
                if (System.currentTimeMillis() - time > 10000) {
                    widnow.dispose();
                    break;
                }
            }
        }
    }).start();
于 2014-04-08T23:24:04.763 に答える