2010-12-29 27 views
8

Ich verwende PrinterJob.printDialog(), damit der Benutzer einen Drucker auswählen und verschiedene Druckeinstellungen ändern kann.Java (native) Druckdialog - Symbol ändern

Der Dialog wird jedoch immer mit dem Standard-Java-Caffeecup-Symbol und nicht mit dem aus meinem Hauptfenster (JFrame) angezeigt.

Wie kann ich das Symbol für diesen Dialog ändern?

ich das folgende Stück Code bin mit:

 
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 

Normalerweise wird ein JDialog das Symbol aus dem „Eltern“ JFrame erbt, aber in diesem Fall kann ich nicht übergeben oder ein übergeordnetes Fenster für das Dialog

angeben

ich Java6 mit

Antwort

3

Es dass a_horse_with_no_name (wie der Rest von uns) mit einem Druckdialog ohne eigenes Symbol geklebt werden scheint. :-)

Auch der Druckdialog von iReport erscheint mit dem Standard-Symbol für die Kaffeetasse. Der Druckdialog verhält sich nicht wie JFileChooser oder JColorChooser. Zum Glück ist es modal.

Wenn Sie das Symbol zu sehr stört, können Sie eine Wrapper-Klasse erstellen und die Details nach Belieben berechnen.

Java6 API bietet keine Möglichkeit, das Symbol zu ändern. Ich werde eine Weile mit der Kaffeetasse leben und auf die nächste Version des JDK warten, die ein Verhalten wie JFileChooser bieten kann.

+1

Danke! Nicht die erhoffte Antwort, aber wenigstens kann ich aufhören mich umzusehen. –

7

Ich habe keine Möglichkeit gefunden, das Symbol zu ändern, aber hier ist eine indirekte Möglichkeit, es zu entfernen.

Sie müssen einen DialogOwner über die Druckattribute angeben. Dies führt dazu, dass java.awt.Window das Standard-Java-Symbol nicht verwendet.

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. 

Hoffe das hilft Ihnen für jetzt !!

Während ich weiter nach einer Möglichkeit suche, diesen Druckdialog zu positionieren. :)

+0

Danke, das Icon ist in der Tat auf diese Weise entfernt. –

+0

- Zugriffsbeschränkung: Auf den Konstruktor DialogOwner (Frame) kann aufgrund der Einschränkung der erforderlichen Bibliothek nicht zugegriffen werden /usr/lib/jvm/java-6-sun-1.6.0.26/jre/lib/ \t rt.jar – AvrDragon

+0

Was ist das? Code für Java 7, da ich es nicht finden konnte. Ich habe eine Referenz in DialogTypeSelection gefunden, aber das hat nicht funktioniert ... –

1

Ich habe eine Lösung/Workaround gefunden, um das Symbol eines Java-Druckdialogfelds zu ändern (nicht native).

Das heißt, dies funktioniert beispielsweise für einen Druckdialog, der durch sun.print.ServiceDialog dargestellt wird.

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()); 

Wiedergabe mit delay und maxCount Werte nach Ihren Bedürfnissen. Natürlich gibt es immer Raum für Verbesserungen.

Offensichtlich muss die Timer vor jedem Anruf an printDialog gestartet werden. Dies funktioniert z. B. auch, wenn der Timer vor dem Aufruf JTable.print() gestartet wird, wenn showPrintDialogtrue ist.

Ich bin froh, dass ich seit Jahren eine Lösung für eine unbeantwortete Frage habe :) (zumindest in meinem Projekt).