2010-11-24 3 views
13

Nous utilisons la nouvelle API d'impression Java qui utilise PrinterJob.printDialog(attributes) pour afficher la boîte de dialogue pour l'utilisateur.Existe-t-il un bon moyen de conserver les paramètres de l'imprimante dans une application Swing?

Voulant sauvegarder les paramètres pour la prochaine fois, je voulais faire de l'utilisateur:

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

    saveAttributesToPreferences(attributes); 
} 

Cependant, ce que je trouve en faisant cela est que parfois (je ne l'ai pas compris comment, encore) les attributs contiennent de mauvaises données, et lorsque vous imprimez, vous obtenez une page blanche de rien. Ensuite, le code enregistre les paramètres empoisonnés dans les préférences, et toutes les impressions suivantes reçoivent également des paramètres empoisonnés. De plus, tout le point de l'exercice, rendant les paramètres de la nouvelle exécution identiques à ceux que l'utilisateur a choisis pour la précédente exécution, est annulé, car la nouvelle boîte de dialogue ne semble pas utiliser les anciens paramètres. Donc, je voudrais savoir s'il existe un moyen approprié de le faire. Sûrement, Sun n'a pas l'intention que les utilisateurs doivent sélectionner l'imprimante, la taille de la page, l'orientation et les paramètres de marge chaque fois que l'application démarre.

Modifier pour montrer la mise en œuvre des méthodes de stockage:

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

Edit: D'accord, il semble que la raison pour laquelle il ne se rappeler que l'imprimante est qu'il ne soit pas dans le PrintRequestAttributeSet du tout. En effet, les marges et les tailles de page sont mémorisées, au moins jusqu'à ce que les paramètres soient empoisonnés au hasard. Mais l'imprimante choisie par l'utilisateur n'est pas ici:

[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

Avez-vous vérifié le bon fonctionnement de 'saveAttributesToPreferences()'? – trashgod

+0

Définir «correct». Il le sérialise en un tableau d'octets et stocke cela dans les préférences, mais que cela soit correct ou non dépend de la réponse à cette question. – Trejkaz

Répondre

1

Il semble que ce que vous cherchez est le PrintServiceAttributeSet, plutôt que le PrintRequestAttributeSet. Jetez un oeil à l'interface PrintServiceAttribute, et voyez si les éléments dont vous avez besoin ont été implémentés en tant que classes. Sinon, vous pouvez implémenter votre propre classe PrintServiceAttribute.

+0

Oui ... c'était le seul. Mis à part le fait d'avoir à faire un peu attention à supprimer certaines des choses qui se retrouvent dans cet ensemble d'attributs, cela fonctionne quand on sérialise les deux ensembles. – Trejkaz

+0

Je vois comment vous pouvez obtenir ces attributs, mais comment les restaurer dans un autre PrinterJob? –

+0

@Maurice Perry: Trejkaz a la méthode loadAttributesFromPreferences() dans sa question. Vous enregistrez les attributs dans un fichier de préférences ou de ressources et vous les lisez plus tard. –

Questions connexes