Java(本机)打印对话框-更改图标

9

我使用PrinterJob.printDialog()来让用户选择打印机并更改各种打印设置。

然而,该对话框始终使用标准的Java咖啡杯图标显示,而不是我的主窗口(JFrame)中的图标。

如何更改该对话框的图标?

我使用以下代码:

PrinterJob pj = PrinterJob.getPrinterJob(); 
pj.printDialog(); // 如何更改在此处显示的对话框的图标
... // 处理对话框的选择

通常,JDialog会从“父”JFrame继承图标,但在这种情况下,我无法传递或指定父窗口。

我正在使用Java6。

3个回答

8

我没有找到更改图标的方法,但是这里有一种间接的方法可以删除它。

您需要通过打印属性指定DialogOwner。这会导致java.awt.Window不使用默认的Java图标。

PrinterJob pj = PrinterJob.getPrinterJob(); 
// Create an Attribute set
PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();

// A different way to bring Up Native Dialog from Java
aset.add(sun.print.DialogTypeSelection.NATIVE); 
// Looks like this class is being moved to javax.print.attribute.standard for Java 7

// To Remove the Icon from the dialog provide an owner.
Frame f = Frame();            
aset.add(new sun.print.DialogOwner(f));

pj.printDialog(aset); // The dialog should not have an icon now.

希望现在能帮到您了!在我继续寻找定位打印对话框的方法时。 :)

访问限制:由于所需库 /usr/lib/jvm/java-6-sun-1.6.0.26/jre/lib/rt.jar 上的限制,构造函数 DialogOwner(Frame) 不可访问。 - AvrDragon
Java 7 的代码是什么,因为我找不到它。 我在 DialogTypeSelection 中找到了一个参考,但那个不起作用... - Stephane Grenier
1
好的,我本来在寻找另一个问题,但是由于你使用了不同的本地对话框呈现方式,你拯救了我的一天。非常感谢! - daniherculano
如果您正在查看此内容,请阅读此答案 - https://stackoverflow.com/a/21767621/405022 - Andez

3
看起来,像我们其他人一样,a_horse_with_no_name将被困在没有自定义图标的打印对话框中。:-)
即使iReport的打印对话框也出现了标准的咖啡杯图标。打印对话框的行为不像JFileChooser或JColorChooser那样。幸运的是,它是模态的。
如果这个图标让你太烦恼了,你可以创建一个包装类来处理它,并按照你喜欢的方式解决细节问题。
Java6 API没有修改图标的方法。我会暂时接受咖啡杯图标,并等待JDK的下一个版本可能会提供类似JFileChooser的行为。

2
我找到了一个解决方案/解决方法,可以更改Java打印对话框的图标(而不是本地图标)。
也就是说,这适用于由sun.print.ServiceDialog表示的打印对话框,例如。
public static void changePrintDialogIcon(final Image icon) {
    int delay = 10;
    final int maxCount = 100;
    final Container callerRoot = FocusManager.getCurrentManager().getCurrentFocusCycleRoot();
    final Timer timer = new Timer(delay, null);
    timer.addActionListener(new ActionListener() {
        private int n = 0;
        @Override
        public void actionPerformed(ActionEvent e) {
            Container currentRoot = FocusManager.getCurrentManager().getCurrentFocusCycleRoot();
            if (callerRoot != currentRoot && currentRoot instanceof JDialog) {
                JDialog serviceDialog = (JDialog) currentRoot;
                serviceDialog.setIconImage(icon);
                timer.stop();
            } else if (n >= maxCount)
                timer.stop();
        }
    });
    timer.start();
}

Image icon = ...;
changePrintDialogIcon(icon);
PrinterJob pj = PrinterJob.getPrinterJob();
pj.printDialog(new HashPrintRequestAttributeSet());

根据您的需求,可以玩转delaymaxCount值。当然,总有改进的空间。
显然,在调用printDialog之前必须启动Timer。例如,如果在showPrintDialogtrue时调用JTable.print()之前启动计时器,这也是有效的。
我很高兴我终于找到了多年未解决的问题的解决方案 :)(至少在我的项目中)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接