Есть ли хороший способ сохранить настройки принтера в приложении Swing? - PullRequest
13 голосов
/ 24 ноября 2010

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

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

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

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

[0] = {java.util.HashMap$Entry@9494} class javax.print.attribute.standard.Media -> na-letter
[1] = {java.util.HashMap$Entry@9501} class javax.print.attribute.standard.Copies -> 1
[2] = {java.util.HashMap$Entry@9510} class javax.print.attribute.standard.MediaPrintableArea -> (10.0,10.0)->(195.9,259.4)mm
[3] = {java.util.HashMap$Entry@9519} class javax.print.attribute.standard.OrientationRequested -> portrait

1 Ответ

1 голос
/ 06 октября 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...