2010-11-24 3 views
13

Мы используем новый API печати Java, который использует PrinterJob.printDialog(attributes) для отображения диалогового окна пользователю.Есть ли способ сохранить настройки принтера в приложении Swing?

Желая сохранить настройки пользователя в следующий раз, я хотел бы сделать это:

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

    saveAttributesToPreferences(attributes); 
} 

Однако то, что я нашел, делая это, что иногда (я не понял, как, пока) атрибуты получают некоторые плохие данные внутри, а затем, когда вы печатаете, вы получаете белую страницу ничего. Затем код сохраняет отравленные настройки в предпочтениях, и все последующие тиражи тоже получают отравленные настройки. Кроме того, вся точка упражнения, сделав настройки для нового прогона такими же, как пользователь, выбранный для предыдущего прогона, побежден, потому что новый диалог не используется для использования старых настроек.

Так что я хотел бы знать, есть ли способ сделать это. Разумеется, Sun не предполагала, что пользователи должны выбирать принтер, размер страницы, ориентацию и настройки полей каждый раз, когда приложение запускается.

Редактировать показать реализацию методов хранения:

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: Хорошо, кажется, что почему-то не помня принтер является то, что он не в PrintRequestAttributeSet вообще. Действительно, поля и размеры страниц запоминаются, по крайней мере, до тех пор, пока настройки не будут отравлены наугад. Но принтер, выбранный пользователем не здесь:

[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

Вы проверили правильную операцию `saveAttributesToPreferences()`? – trashgod 2010-11-24 10:05:05

+0

Определите «правильный». Он сериализует его в массив байтов и сохраняет его в предпочтениях, но верно ли это или нет, зависит от ответа на этот вопрос. – Trejkaz 2010-11-24 21:50:08

ответ

1

Похоже, что вы ищете является PrintServiceAttributeSet, а не PrintRequestAttributeSet.

Посмотрите на интерфейс PrintServiceAttribute и посмотрите, были ли эти элементы реализованы как классы. Если нет, вы можете реализовать свои собственные классы PrintServiceAttribute.

Смежные вопросы