2010-12-29 12 views
8

Io uso PrinterJob.printDialog() per consentire all'utente di selezionare una stampante e modificare varie impostazioni di stampa.Finestra di dialogo di stampa Java (nativa) - cambia icona

Tuttavia, la finestra di dialogo viene sempre visualizzata utilizzando l'icona standard di caffè coffeecup e non quella dalla finestra principale (JFrame).

Come posso modificare l'icona di quella finestra di dialogo?

sto usando il seguente pezzo di codice:

 
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 

Normalmente un JDialog eredita l'icona dal "padre" JFrame, ma in questo caso non posso passare o specificare una finestra padre per quella finestra

sto usando java6

risposta

3

sembra che a_horse_with_no_name sarà bloccato (come il resto di noi) con una finestra di stampa senza icona personalizzata. :-)

Anche la finestra di dialogo di stampa di iReport viene visualizzata con l'icona standard della tazza di caffè. La finestra di dialogo Stampa non si comporta come JFileChooser o JColorChooser. Fortunatamente è modale.

Se l'icona ti infastidisce troppo, puoi creare una classe wrapper attorno ad essa e elaborare i dettagli nel modo desiderato.

Java6 API non offre alcun modo per modificare l'icona. Vivrò per un po 'con la tazza di caffè e aspetterò la prossima versione del JDK che potrebbe offrire un comportamento come JFileChooser.

+1

Grazie! Non è la risposta che speravo, ma almeno posso smettere di guardarmi intorno. –

7

Non ho trovato un modo per cambiare l'icona, ma qui c'è un modo indiretto per rimuoverlo.

È necessario specificare un DialogOwner tramite gli attributi di stampa. Ciò fa sì che java.awt.Window non utilizzi l'icona Java predefinita.

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. 

Spero che questo ti aiuti per ora !!

Mentre continuo a cercare un modo per posizionare questa finestra di stampa. :)

+0

Grazie, l'icona viene effettivamente rimossa in questo modo. –

+0

- Restrizione di accesso: Il costruttore DialogOwner (Frame) non è accessibile a causa della restrizione sulla libreria richiesta /usr/lib/jvm/java-6-sun-1.6.0.26/jre/lib/ \t rt.jar – AvrDragon

+0

Qual è il codice per questo per Java 7 dal momento che non riuscivo a trovarlo. Ho trovato un riferimento in DialogTypeSelection ma non ha funzionato ... –

1

Ho trovato una soluzione/soluzione alternativa per modificare l'icona di una finestra di dialogo di stampa Java (non nativo).

Cioè, questo funziona per una finestra di dialogo di stampa rappresentata da sun.print.ServiceDialog, ad esempio.

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

Gioca con delay e maxCount valori in base alle proprie esigenze. Certo, c'è sempre spazio per miglioramenti.

Ovviamente, il Timer deve essere avviato prima di qualsiasi chiamata a printDialog. Ad esempio, questo funziona anche se il timer viene avviato prima di chiamare JTable.print() quando showPrintDialog è true.

Sono contento di avere una soluzione per una domanda senza risposta per anni :) (almeno nel mio progetto).

Problemi correlati