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

时间:2010-12-29 13:23:27

标签: java printing awt

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

但是,对话框始终使用标准Java coffeecup图标显示,而不是我主窗口(JFrame)中的图标。

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

我正在使用以下代码:

PrinterJob pj = PrinterJob.getPrinterJob(); 
pj.printDialog(); // how do I change the icon for the dialog that is displayed here

... // process the selection from the dialog

通常,JDialog会继承“父”JFrame中的图标,但在这种情况下,我无法传递或指定该对话框的父窗口

我正在使用Java6

3 个答案:

答案 0 :(得分:8)

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

您需要通过print属性指定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.

希望这对你有所帮助!!

当我继续搜索某种方式来定位此打印对话框时。 :)

答案 1 :(得分:3)

似乎a_horse_with_no_name将被卡住(就像我们其他人一样),打印对话框没有自定义图标。 : - )

即使是iReport的打印对话框也会显示标准的咖啡杯图标。 “打印”对话框的行为与JFileChooser或JColorChooser不同。幸运的是它是模态的。

如果图标困扰你太多,你可以围绕它创建一个包装类,并按照你喜欢的方式计算出细节。

Java6 API无法修改图标。我将使用咖啡杯一段时间,并将等待可能提供像JFileChooser这样的行为的JDK的下一个版本。

答案 2 :(得分:1)

我找到了一个解决方案/解决方法来更改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值。当然,总有改进的余地。

显然,必须在调用Timer之前启动printDialog。例如,如果在JTable.print()showPrintDialog时调用true之前启动计时器,这也有效。

我很高兴多年来我找到了一个未解答的问题的解决方案:)(至少在我的项目中)。