如何在Java 7上的“打印”对话框中删除Java图标

时间:2014-02-13 21:02:48

标签: java swing printing java-7

我正在尝试:

PrinterJob pj = PrinterJob.getPrinterJob(); 
pj.printDialog();

并想要在模态打印对话框窗口中更改Java图标(甚至删除它),但我似乎无法。

以下SO question似乎answer it for Java 6,但即使使用以下StackOverflow answer为Java 7提供的信息,我也无法解决。我找不到合适的常量来删除它。

有没有人知道如何为Java 7专门做这个?

3 个答案:

答案 0 :(得分:0)

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 :(得分:0)

根据linked question的评论中的建议,您应该尝试

aset.add(javax.print.attribute.standard.DialogTypeSelection.NATIVE);

请查看DialogTypeSelection了解详情

更新了示例

该示例不使用父框架中的图标,这样会很好,但会从打印对话框中删除默认的Java图标...

Without Icon

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.print.PrinterJob;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import sun.print.DialogTypeSelection;

public class TestPrintDialog extends JFrame {

    public static void main(String[] args) {
        TestPrintDialog window = new TestPrintDialog();
        window.setVisible(true);
    }

    public TestPrintDialog() {
        setIconImage(new ImageIcon("NotJavaIcon.png").getImage());
        this.setSize(200, 100);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLayout(new FlowLayout());

        JButton printDialogButton = new JButton("Print Dialog");
        printDialogButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                final PrintRequestAttributeSet attributes = new HashPrintRequestAttributeSet();
                attributes.add(DialogTypeSelection.NATIVE);
                attributes.add(new sun.print.DialogOwner(TestPrintDialog.this)); 
                PrinterJob printJob = PrinterJob.getPrinterJob();
                printJob.printDialog(attributes);

            }
        });
        this.add(printDialogButton);
    }
}

答案 2 :(得分:0)

您指定的代码仅在PrinterJob支持属性sun.print.DialogOwner()时才有效。

PrinterJob.java是一个界面。 getPrinterJob()必须由某些打印服务类实现。此类被指定为系统属性“java.awt.printerjob”。 getPrinterJob()只返回在该系统属性

下定义的类
String nm = System.getProperty("java.awt.printerjob", null);
try {
   return (PrinterJob)Class.forName(nm).newInstance();
}

所以最终这一切都取决于返回的Class是否支持该特定属性。

您可以使用isAttributeCategorySupported来检查是否支持某个属性。点击“打印”查看结果。

 Frame f = new Frame();
DialogOwner dialogOwner = new sun.print.DialogOwner(f);

PrinterJob pj = PrinterJob.getPrinterJob();
boolean ok = pj.printDialog(aset);

System.out.println( "Result : " + dialogOwner.getName() + " supported : " + pj.getPrintService().isAttributeCategorySupported(dialogOwner.getClass()) );


// Result : dialog-owner supported : false

支持的属性可以在下面的链接中找到。

http://docs.oracle.com/javase/7/docs/api/javax/print/attribute/standard/package-summary.html

http://docs.oracle.com/javase/7/docs/technotes/guides/jps/spec/attributes.fm5.html

sun.print.DialogOwner.java不是上面列表的一部分。它不是Internet打印协议(IPP)的一部分。因此不支持。