作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我遇到以下问题:
我们的 Swing 应用程序有一个超时,它会将用户返回到登录框架。
如果用户打开打印对话框并使其保持打开状态,然后在超时后尝试单击打印按钮,我们的应用程序将失败并向用户显示错误。 (应用程序逻辑期望用户做出打印选择,然后执行一些逻辑)。
当应用程序超时时,是否可以以某种方式关闭打印对话框,或者向打印对话框添加自定义超时?
编辑:到目前为止我尝试过的(MCVE):
public class JavaPrintTest implements Printable {
public int print(Graphics g, PageFormat pf, int pageIndex) {
if (pageIndex != 0)
return NO_SUCH_PAGE;
Graphics2D g2 = (Graphics2D) g;
g2.setFont(new Font("Serif", Font.PLAIN, 36));
g2.setPaint(Color.black);
g2.drawString("Java Source and Support!", 144, 144);
return PAGE_EXISTS;
}
public static void main(String[] args) {
new java.util.Timer().schedule(
new java.util.TimerTask() {
@Override
public void run() {
Window[] allWindows = Window.getWindows();
for (Window w:allWindows) {
w.setVisible(false);
w.dispose();
}
for (Frame frame : Frame.getFrames() ) {
frame.setVisible(false);
frame.dispose();
}
}
},
5000
);
PrinterJob pj = PrinterJob.getPrinterJob();
pj.setPrintable(new JavaPrintTest());
if (pj.printDialog()) {
try {
pj.print();
} catch (PrinterException e) {
System.out.println(e);
}
}
}
}
我启动一个计时器,5 秒后将尝试关闭打印对话框,它会尝试迭代所有窗口和所有框架,但对话框不会关闭。
最佳答案
您可以在返回登录窗口之前找到并关闭所有 Activity 窗口:
private void logout() {
Window[] allWindows = Window.getWindows();
for (Window w:allWindows) {
w.setVisible(false);
w.dispose();
}
returnToLoginWindow();
}
编辑:打印对话框是 native 系统对话框窗口,不受 dispose() 影响。
例如,在 Windows 上,Java 返回 sun.awt.windows.WPrintDialog
。
对于此类 native 对话框,我发现的唯一方法是作为解决方法:
for (Window w: allWindows) {
//System.out.println(w.getClass().getSimpleName()+": "+w);
try {
Robot r = new Robot();
r.keyPress(KeyEvent.VK_ESCAPE);
r.keyRelease(KeyEvent.VK_ESCAPE);
} catch (AWTException e) {
e.printStackTrace();
}
}
以下 API 不会影响 native 对话框(至少在 Windows 上):
WindowEvent windowClosing = new WindowEvent(w, WindowEvent.WINDOW_CLOSING);
Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(windowClosing);
w.dispatchEvent(windowClosing);
w.setVisible(false);
w.dispose();
关于java - 如何在 Java Swing 中关闭 PrinterJob 对话框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34040766/
我是一名优秀的程序员,十分优秀!