2010-12-29 28 views
8

Uso PrinterJob.printDialog() para permitir que el usuario seleccione una impresora y cambie varias configuraciones de impresión.Diálogo de impresión de Java (original) - cambie el ícono

Sin embargo, el cuadro de diálogo siempre se muestra utilizando el icono de taza de Java estándar y no el de mi ventana principal (JFrame).

¿Cómo puedo cambiar el icono de ese cuadro de diálogo?

estoy usando el siguiente fragmento de código:

 
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 hereda el icono de la "matriz" JFrame, pero en este caso no puedo pasar o especificar una ventana padre para ese diálogo

estoy usando java6

Respuesta

3

parece que a_horse_with_no_name será atrapado (como el resto de nosotros) con un diálogo de impresión sin icono personalizado. :-)

Incluso el cuadro de diálogo de impresión de iReport aparece con el icono estándar de la taza de café. El diálogo de impresión no se comporta como JFileChooser o JColorChooser. Afortunadamente es modal.

Si el icono te molesta demasiado, podrías crear una clase contenedora alrededor y resolver los detalles de la forma que desees.

Java6 API no ofrece ninguna forma de modificar el icono. Viviré con la taza de café por un tiempo y esperaré la próxima versión del JDK que pueda ofrecer un comportamiento como JFileChooser.

+1

Gracias! No es la respuesta que esperaba, pero al menos puedo dejar de mirar. –

7

No he encontrado una manera de cambiar el ícono, pero aquí hay una manera indirecta de eliminarlo.

Debe especificar un DialogOwner mediante los atributos de impresión. Esto hace que java.awt.Window no use el icono predeterminado de 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. 

Espero que esto te ayude por ahora!

Mientras continúo buscando alguna forma de posicionar este diálogo de impresión. :)

+0

Gracias, el icono se eliminó de esta manera. –

+0

- Restricción de acceso: no se puede acceder al constructor DialogOwner (Marco) debido a la restricción en la biblioteca requerida /usr/lib/jvm/java-6-sun-1.6.0.26/jre/lib/ \t rt.jar – AvrDragon

+0

¿Cuál es el código para esto para Java 7 ya que no pude encontrarlo. Encontré una referencia en DialogTypeSelection pero eso no funcionó ... –

1

He encontrado una solución/solución para cambiar el icono de un diálogo de impresión de Java (no nativo).

Es decir, esto funciona para un cuadro de diálogo de impresión representado por sun.print.ServiceDialog, por ejemplo.

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

Juego con delay y maxCount valores de acuerdo con sus necesidades. Por supuesto, siempre hay margen de mejora.

Obviamente, el Timer se debe iniciar antes de cualquier llamada al printDialog. Por ejemplo, esto también funciona si el temporizador se inicia antes de llamar al JTable.print() cuando showPrintDialog es true.

Me alegro de tener una solución para una pregunta sin respuesta durante años :) (al menos en mi proyecto).

Cuestiones relacionadas