如何在JDialog空闲时设置超时(例如90秒)?
一旦没有动作,移动,选择在JDialog中完成90秒就会退出。
此线程提供超时但没有空闲状态 - Can I set a timer on a Java Swing JDialog box to close after a number of milliseconds
谢谢!
答案 0 :(得分:1)
好的,最大的问题是获取有关用户交互的足够信息。您可以尝试使用AWTEventListener
,这是一种监控AWTEvent
EventQueue
的方法,并且应该在很大程度上为您提供有关可能的互动的足够信息。
因为并非所有事件都通过EventQueue
,所以有时候这可能并不总是有效,在这种情况下,您需要将附加的侦听器附加到组件上,从而给您带来麻烦并手动重置计时器。 ..
import java.awt.AWTEvent;
import java.awt.Component;
import java.awt.Dialog;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Frame;
import java.awt.GraphicsConfiguration;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Toolkit;
import java.awt.Window;
import java.awt.event.AWTEventListener;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
IdleDialog dialog = new IdleDialog(5, (Window) null, "Testing");
dialog.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
dialog.add(new TestPane());
dialog.pack();
dialog.setLocationRelativeTo(null);
dialog.setVisible(true);
}
});
}
public class TestPane extends JPanel {
public TestPane() {
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridwidth = GridBagConstraints.REMAINDER;
add(new JLabel("This is a bad idea"), gbc);
add(new JButton("Don't tell me"), gbc);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
}
public class IdleDialog extends JDialog {
private long timeOut = 90 * 1000;
private long startTime;
private Timer timer;
private String originalTitle;
public IdleDialog(long timeOut) {
init(timeOut);
}
public IdleDialog(long timeOut, Frame owner) {
super(owner);
init(timeOut);
}
public IdleDialog(long timeOut, Frame owner, boolean modal) {
super(owner, modal);
init(timeOut);
}
public IdleDialog(long timeOut, Frame owner, String title) {
super(owner, title);
init(timeOut);
}
public IdleDialog(long timeOut, Frame owner, String title, boolean modal) {
super(owner, title, modal);
init(timeOut);
}
public IdleDialog(long timeOut, Frame owner, String title, boolean modal, GraphicsConfiguration gc) {
super(owner, title, modal, gc);
init(timeOut);
}
public IdleDialog(long timeOut, Dialog owner) {
super(owner);
init(timeOut);
}
public IdleDialog(long timeOut, Dialog owner, boolean modal) {
super(owner, modal);
init(timeOut);
}
public IdleDialog(long timeOut, Dialog owner, String title) {
super(owner, title);
init(timeOut);
}
public IdleDialog(long timeOut, Dialog owner, String title, boolean modal) {
super(owner, title, modal);
init(timeOut);
}
public IdleDialog(long timeOut, Dialog owner, String title, boolean modal, GraphicsConfiguration gc) {
super(owner, title, modal, gc);
init(timeOut);
}
public IdleDialog(long timeOut, Window owner) {
super(owner);
init(timeOut);
}
public IdleDialog(long timeOut, Window owner, ModalityType modalityType) {
super(owner, modalityType);
init(timeOut);
}
public IdleDialog(long timeOut, Window owner, String title) {
super(owner, title);
init(timeOut);
}
public IdleDialog(long timeOut, Window owner, String title, ModalityType modalityType) {
super(owner, title, modalityType);
init(timeOut);
}
public IdleDialog(long timeOut, Window owner, String title, ModalityType modalityType, GraphicsConfiguration gc) {
super(owner, title, modalityType, gc);
init(timeOut);
}
protected void init(double timeOutValue) {
this.timeOut = Math.round(timeOutValue * 1000);
timer = new Timer(1000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
long runningTime = System.currentTimeMillis() - startTime;
System.out.println(runningTime + "/" + timeOut);
if (runningTime >= timeOut) {
timer.stop();
dispose();
} else {
String title = originalTitle + " [" + (((timeOut - runningTime) / 1000) + 1) + "]";
setTitle(title);
}
}
});
originalTitle = getTitle();
String title = originalTitle + " [" + ((timeOut / 1000)) + "]";
setTitle(title);
addPropertyChangeListener("title", new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (!timer.isRunning()) {
originalTitle = (String) evt.getNewValue();
}
}
});
addWindowListener(new WindowAdapter() {
@Override
public void windowOpened(WindowEvent e) {
timer.start();
}
@Override
public void windowClosed(WindowEvent e) {
timer.stop();
}
});
Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {
@Override
public void eventDispatched(AWTEvent event) {
Object source = event.getSource();
if (source instanceof Component) {
Window win = null;
if (!(source instanceof Window)) {
win = SwingUtilities.getWindowAncestor((Component) source);
} else {
win = (Window) source;
}
if (IdleDialog.this.equals(win)) {
if (win.isVisible() && timer.isRunning()) {
resetTimeout();
}
}
}
}
}, AWTEvent.ACTION_EVENT_MASK
| AWTEvent.ADJUSTMENT_EVENT_MASK
| AWTEvent.COMPONENT_EVENT_MASK
| AWTEvent.CONTAINER_EVENT_MASK
| AWTEvent.FOCUS_EVENT_MASK
| AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK
| AWTEvent.HIERARCHY_EVENT_MASK
| AWTEvent.INPUT_METHOD_EVENT_MASK
| AWTEvent.INVOCATION_EVENT_MASK
| AWTEvent.ITEM_EVENT_MASK
| AWTEvent.KEY_EVENT_MASK
| AWTEvent.MOUSE_EVENT_MASK
| AWTEvent.MOUSE_MOTION_EVENT_MASK
| AWTEvent.MOUSE_WHEEL_EVENT_MASK
| // AWTEvent.PAINT_EVENT_MASK |
AWTEvent.TEXT_EVENT_MASK
| AWTEvent.WINDOW_EVENT_MASK
| AWTEvent.WINDOW_FOCUS_EVENT_MASK
| AWTEvent.WINDOW_STATE_EVENT_MASK
);
}
public void resetTimeout() {
timer.restart();
startTime = System.currentTimeMillis();
String title = originalTitle + " [" + ((timeOut / 1000)) + "]";
setTitle(title);
}
}
}
答案 1 :(得分:1)
您还可以查看Application Inactivity以获得可在任何窗口(框架,对话框)上使用的更通用的解决方案。
您只需在一段时间不活动后提供要调用的Action
,并自动调用Action。