我正在开发一个项目,我希望以编程方式关闭通用的JOptionPane(通过不点击任何按钮)。当计时器到期时,我想关闭任何可能打开的可能的JOptionPane并将用户踢回我的程序的登录屏幕。我可以很好地踢回用户,但除非我实际点击它上面的按钮,否则JOptionPane仍然存在。
我看过许多没有运气的网站。似乎不可能在JOptionPane的“Red X”上调用doClick()方法,并且使用JOptionpane.getRootFrame()。dispose()不起作用。
答案 0 :(得分:15)
从技术上讲,你可以循环遍历应用程序的所有窗口,检查它们是否为JDialog类型并且有一个JOptionPane类型的子节点,如果是这样,则处理对话框:
Action showOptionPane = new AbstractAction("show me pane!") {
@Override
public void actionPerformed(ActionEvent e) {
createCloseTimer(3).start();
JOptionPane.showMessageDialog((Component) e.getSource(), "nothing to do!");
}
private Timer createCloseTimer(int seconds) {
ActionListener close = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Window[] windows = Window.getWindows();
for (Window window : windows) {
if (window instanceof JDialog) {
JDialog dialog = (JDialog) window;
if (dialog.getContentPane().getComponentCount() == 1
&& dialog.getContentPane().getComponent(0) instanceof JOptionPane){
dialog.dispose();
}
}
}
}
};
Timer t = new Timer(seconds * 1000, close);
t.setRepeats(false);
return t;
}
};
答案 1 :(得分:1)
此代码来自 https://amp.reddit.com/r/javahelp/comments/36dv3t/how_to_close_this_joptionpane_using_code/对我来说似乎是最好的方法。它涉及实例化JOptionPane类,而不是使用静态帮助器方法为您完成。好处是你有一个JOptionPane对象,当你想关闭对话框时可以处理它。
JOptionPane jop = new JOptionPane();
jop.setMessageType(JOptionPane.PLAIN_MESSAGE);
jop.setMessage("Hello World");
JDialog dialog = jop.createDialog(null, "Message");
// Set a 2 second timer
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(2000);
} catch (Exception e) {
}
dialog.dispose();
}
}).start();
dialog.setVisible(true);