Java 用户不活动后如何关闭JFrame?

Java 用户不活动后如何关闭JFrame?,java,swing,jframe,thread-sleep,user-inactivity,Java,Swing,Jframe,Thread Sleep,User Inactivity,在用户处于非活动状态后,如何关闭JFrame 到目前为止, Thread.sleep(10000); 如果有人能给我这样做的代码,我将不胜感激 我是Java新手,想了解更多关于系统安全的信息试试这个 应采取的步骤: 它可以监听按键事件和鼠标事件。 将启动一个新线程进行检查。 如果时间差超过以下示例代码中指定的时间10秒,则处理该窗口。 这就是全部。 以下是示例代码: private long time; ... long eventMask = AWTEvent.K

在用户处于非活动状态后,如何关闭JFrame

到目前为止,

Thread.sleep(10000);
如果有人能给我这样做的代码,我将不胜感激

我是Java新手,想了解更多关于系统安全的信息

试试这个

应采取的步骤:

它可以监听按键事件和鼠标事件。 将启动一个新线程进行检查。 如果时间差超过以下示例代码中指定的时间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();
试试这个

应采取的步骤:

它可以监听按键事件和鼠标事件。 将启动一个新线程进行检查。 如果时间差超过以下示例代码中指定的时间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();

这是Braj使用javax.swing.Timer的想法的一个例子

它简化了流程,因为您不需要监视事件之间的时间间隔,并确保在触发计时器时,事件在事件调度线程中发生,从而进一步降低了复杂性

还请注意,我包括了AWTEvent.MOUSE\u MOTION\u EVENT\u MASK和AWTEvent.MOUSE\u WHEEL\u EVENT\u 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();
            }
        });
    }

}

这是Braj使用javax.swing.Timer的想法的一个例子

它简化了流程,因为您不需要监视事件之间的时间间隔,并确保在触发计时器时,事件在事件调度线程中发生,从而进一步降低了复杂性

还请注意,我包括了AWTEvent.MOUSE\u MOTION\u EVENT\u MASK和AWTEvent.MOUSE\u WHEEL\u EVENT\u 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();
            }
        });
    }

}

添加单击或键侦听器并监视它。存储执行最后一个用户操作的时间,并使用swing定时器。@Braj,如何编写代码lol@user2269663@Azar MouseListener可能不是最好的解决方案,因为它可以被其他组件用MouseListener隐藏起来……只是说@MaDeCalter好点,我没有考虑。添加点击或按键监听器并监控它。存储执行最后一个用户操作的时间,并使用swing定时器。@Braj,如何编写代码lol@user2269663@Azar MouseListener可能不是最好的解决方案,因为它可以被其他组件用MouseListener隐藏起来……只是说@MordPosiver好点,我没有考虑。几乎,你是窗口。处置是从EDT执行的。更好的解决方案是使用SwingTimer,并在每次事件通过事件处理程序时简单地重新启动它。此外,事件掩码是事件类型的位掩码,因此将它们添加在一起将不起作用,您需要使用|我认为-AWTEvent.KEY_event|u mask | AWTEvent.MOUSE_event_MASK@MadProgrammer请你用SwingTimer发布一个答案,这样对我和其他人都有帮助,您没有监视事件发生在哪个窗口;我想只有一个窗口。我在JFrame上尝试了key listener,但它不起作用。你能告诉我吗?差不多了,你是window.dispose在EDT之外被执行了。更好的解决方案是使用SwingTimer,并在每次事件通过事件处理程序时简单地重新启动它。此外,事件掩码是事件类型的位掩码,因此将它们添加在一起将不起作用,您需要使用|我认为-AWTEvent.KEY_event|u mask | AWTEvent.MOUSE_event_MASK@MadProgrammer请你用SwingTimer发布一个答案,这样对我和其他人都有帮助,您没有监视事件发生在哪个窗口;我想只有一个窗口。我在JFrame上尝试了key listener,但它不起作用。你能告诉我吗?