JavaFX打印:PageSetup对话框取消仍返回True问题求助
JavaFX PageSetupDialog 取消按钮返回true的解决办法
我之前也踩过这个JavaFX的坑!你遇到的情况完全合理——PrinterJob.showPageSetupDialog()的返回值逻辑和我们直觉里的“确认返回true,取消返回false”完全不一样,这可不是什么bug,只是API的设计逻辑容易让人误解:这个方法返回true仅表示对话框被正常显示并关闭了,哪怕用户点击的是取消按钮;只有当对话框无法显示(比如没有可用打印机、系统不支持)时才会返回false。
要区分用户到底是确认了页面设置还是取消了操作,我们可以通过对比对话框打开前后的打印机/页面设置来判断,具体实现如下:
private void pageSetup(Node node){ // 用当前节点所在的窗口作为对话框的父窗口,替代新建Stage Window owner = node.getScene().getWindow(); PrinterJob job = PrinterJob.createPrinterJob(); if(job == null){ System.out.println("无法创建打印作业"); return; } // 保存对话框打开前的原始设置 Printer originalPrinter = job.getPrinter(); PageLayout originalPageLayout = job.getJobSettings().getPageLayout(); boolean dialogSuccessfullyShown = job.showPageSetupDialog(owner); if(dialogSuccessfullyShown){ // 获取对话框关闭后的当前设置 Printer currentPrinter = job.getPrinter(); PageLayout currentPageLayout = job.getJobSettings().getPageLayout(); // 通过对比设置判断用户操作 boolean settingsWereModified = !currentPrinter.equals(originalPrinter) || !currentPageLayout.equals(originalPageLayout); if(settingsWereModified){ System.out.println("用户确认了页面设置"); print(job, node); job.endJob(); } else { System.out.println("用户取消了页面设置"); job.cancelJob(); } } else { System.out.println("页面设置对话框无法显示"); job.cancelJob(); } }
关键说明:
- 设置对比逻辑:如果用户点击了确认按钮,哪怕只是修改了一点点页面设置(比如纸张方向、边距),当前的打印机或页面布局都会和原始值不同;如果点击取消,这些设置会保持不变。
- 父窗口优化:用
node.getScene().getWindow()替代新建Stage作为对话框的父窗口,能让对话框正确以模态方式依附在主窗口上,避免出现独立窗口的奇怪行为。
这个方法能准确区分用户的确认/取消操作,完美解决你遇到的返回值误导问题。
内容的提问来源于stack exchange,提问作者Karl Garcia
相关产品推荐
相关产品推荐

