Java 用户不活动后如何关闭JFrame?
在用户处于非活动状态后,如何关闭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
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,但它不起作用。你能告诉我吗?