Есть ли способ сохранить настройки принтера в приложении Swing?
Мы используем новый 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] = {[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
Ответы
Ответ 1
Похоже, что вы ищете PrintServiceAttributeSet, а не PrintRequestAttributeSet
.
Посмотрите на PrintServiceAttribute интерфейс и посмотрите, были ли нужные элементы реализованы как классы. Если нет, вы можете реализовать свой собственный PrintServiceAttribute
класс (ы).