java - 如何在 Java Swing 中关闭 PrinterJob 对话框?

标签 java swing

我遇到以下问题:

我们的 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/

相关文章:

java - EDT队列切割

java - 如何使用 java 中的 jButton 打印 TextArea 中的文本?

java - 对于包含使用 Immutables 生成的列表的 Java 类,如何从 json 字符串获取对象?

java - 如何使用 XSSF (Apache POI 3.8) 调整图表大小?

java - 键盘上的 Control 键 + M 可触发 SWT 中树项目的双击功能

Java Enum 或其他集合

java - LazyList 的 listview 无法使用新的 arraylist 刷新

java - 处理文件的小程序在本地工作但在网站上失败

java - 线程 "AWT-EventQueue-0"中的异常?

java - 如何创建全屏宽度 jtoolbar