2010-11-24 14 views
13

Estamos utilizando la nueva API de impresión de Java que usa PrinterJob.printDialog(attributes) para mostrar el diálogo al usuario.¿Existe alguna manera de mantener la configuración de la impresora en una aplicación Swing?

querer salvar la configuración del usuario para la próxima vez, lo que quería hacer esto:

PrintRequestAttributeSet attributes = loadAttributesFromPreferences(); 
if (printJob.printDialog(attributes)) { 
    // print, and then... 

    saveAttributesToPreferences(attributes); 
} 

Sin embargo, lo que encontré al hacer esto es que a veces (no he encontrado la forma, sin embargo) los atributos obtienen algunos datos incorrectos en el interior, y luego cuando imprime, obtiene una página blanca de nada. Luego, el código guarda las configuraciones envenenadas en las preferencias, y todas las ejecuciones de impresión subsiguientes también se envenenan. Además, todo el objetivo del ejercicio, que hace que la configuración de la nueva ejecución sea la misma que la elegida por el usuario para la ejecución anterior, se ve frustrada porque no parece que el nuevo cuadro de diálogo use la configuración anterior.

Así que me gustaría saber si existe una forma adecuada de hacerlo. Seguramente Sun no tenía la intención de que los usuarios tengan que seleccionar la impresora, el tamaño de página, la orientación y los ajustes de margen cada vez que se inicia la aplicación.

Editar para mostrar la aplicación de los métodos de almacenamiento:

private PrintRequestAttributeSet loadAttributesFromPreferences() 
{ 
    PrintRequestAttributeSet attributes = null; 

    byte[] marshaledAttributes = preferences.getByteArray(PRINT_REQUEST_ATTRIBUTES_KEY, null); 
    if (marshaledAttributes != null) 
    { 
     try 
     { 
      @SuppressWarnings({"IOResourceOpenedButNotSafelyClosed"}) 
      ObjectInput objectInput = new ObjectInputStream(new ByteArrayInputStream(marshaledAttributes)); 

      attributes = (PrintRequestAttributeSet) objectInput.readObject(); 
     } 
     catch (IOException e) 
     { 
      // Can occur due to invalid object data e.g. InvalidClassException, StreamCorruptedException 
      Logger.getLogger(getClass()).warn("Error trying to read print attributes from preferences", e); 
     } 
     catch (ClassNotFoundException e) 
     { 
      Logger.getLogger(getClass()).warn("Class not found trying to read print attributes from preferences", e); 
     } 
    } 

    if (attributes == null) 
    { 
     attributes = new HashPrintRequestAttributeSet(); 
    } 

    return attributes; 
} 

private void saveAttributesToPreferences(PrintRequestAttributeSet attributes) 
{ 
    ByteArrayOutputStream storage = new ByteArrayOutputStream(); 
    try 
    { 
     ObjectOutput objectOutput = new ObjectOutputStream(storage); 
     try 
     { 
      objectOutput.writeObject(attributes); 
     } 
     finally 
     { 
      objectOutput.close(); // side-effect of flushing the underlying stream 
     } 
    } 
    catch (IOException e) 
    { 
     throw new IllegalStateException("I/O error writing to a stream going to a byte array", e); 
    } 

    preferences.putByteArray(PRINT_REQUEST_ATTRIBUTES_KEY, storage.toByteArray()); 
} 

Editar: bien, parece que la razón no es recordar la impresora es que no está en el PrintRequestAttributeSet en absoluto. De hecho, los márgenes y los tamaños de página se recuerdan, al menos hasta que la configuración se envenene al azar. Pero la impresora elegida por el usuario no se encuentra aquí:

[0] = {[email protected]} class javax.print.attribute.standard.Media -> na-letter 
[1] = {[email protected]} class javax.print.attribute.standard.Copies -> 1 
[2] = {[email protected]} class javax.print.attribute.standard.MediaPrintableArea -> (10.0,10.0)->(195.9,259.4)mm 
[3] = {[email protected]} class javax.print.attribute.standard.OrientationRequested -> portrait 
+0

¿Ha verificado el funcionamiento correcto de 'saveAttributesToPreferences()'? – trashgod

+0

Defina 'correcto'. Lo serializa en una matriz de bytes y lo almacena en preferencias, pero si eso es correcto o no depende de la respuesta a esta pregunta. – Trejkaz

Respuesta

1

Parece ser que lo que estás buscando es la PrintServiceAttributeSet, en lugar de la PrintRequestAttributeSet.

Eche un vistazo a la interfaz PrintServiceAttribute y vea si los elementos que necesita se han implementado como clases. De lo contrario, puede implementar su propia clase (s) PrintServiceAttribute.

+0

Sí ... ese fue el indicado. Además de tener que ser un poco cuidadoso para eliminar algunas de las cosas que terminan en ese conjunto de atributos, funciona al serializar ambos conjuntos. – Trejkaz

+0

Veo cómo puede obtener estos atributos, pero ¿cómo los restaura en otro PrinterJob? –

+0

@Maurice Perry: Trejkaz tiene el método loadAttributesFromPreferences() en su pregunta. Guarda los atributos en un archivo de preferencias o recursos, y los lee más tarde. –

Cuestiones relacionadas