Java (родной) диалог печати - изменить значок - PullRequest
8 голосов
/ 29 декабря 2010

Я использую PrinterJob.printDialog(), чтобы позволить пользователю выбрать принтер и изменить различные параметры печати.

Однако диалоговое окно всегда отображается с использованием стандартной иконки кофейной чашки Java, а не с моего главного окна (JFrame).

Как я могу изменить значок для этого диалога?

Я использую следующий фрагмент кода:

PrinterJob pj = PrinterJob.getPrinterJob(); 
pj.printDialog(); // how do I change the icon for the dialog that is displayed here

... // process the selection from the dialog

Обычно JDialog наследует значок от "родительского" JFrame, но в этом случае я не могу передать или указать родительское окно для этого диалога

Я использую Java6

Ответы [ 3 ]

8 голосов
/ 16 марта 2011

Я не нашел способ изменить значок, но вот один косвенный способ удалить его.

Вам необходимо указать DialogOwner через атрибуты печати. Это заставляет java.awt.Window не использовать значок Java по умолчанию.

PrinterJob pj = PrinterJob.getPrinterJob(); 
// Create an Attribute set
PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();

// A different way to bring Up Native Dialog from Java
aset.add(sun.print.DialogTypeSelection.NATIVE); 
// Looks like this class is being moved to javax.print.attribute.standard for Java 7

// To Remove the Icon from the dialog provide an owner.
Frame f = Frame();            
aset.add(new sun.print.DialogOwner(f));

pj.printDialog(aset); // The dialog should not have an icon now.

Надеюсь, это поможет вам сейчас !!

Пока я продолжаю искать какой-то способ позиционирования этого диалогового окна печати. :)

3 голосов
/ 29 декабря 2010

Похоже, что a_horse_with_no_name застрянет (как и все мы) в диалоговом окне печати без пользовательского значка.: -)

Даже диалоговое окно печати iReport отображается со стандартным значком кофейной чашки.Диалог печати не ведет себя как JFileChooser или JColorChooser.К счастью, это модально.

Если значок вас слишком беспокоит, вы можете создать вокруг него класс-оболочку и проработать детали так, как вам нравится.

Java6 API не предлагает способа изменения значка.Я поживу с чашкой кофе некоторое время и буду ждать следующей версии JDK, которая может предложить поведение, подобное JFileChooser.

1 голос
/ 16 мая 2016

Я нашел решение / обходной путь для изменения значка диалогового окна печати Java ( не собственный).

То есть это работает для диалогового окна печати, представленного, например, sun.print.ServiceDialog.

public static void changePrintDialogIcon(final Image icon) {
    int delay = 10;
    final int maxCount = 100;
    final Container callerRoot = FocusManager.getCurrentManager().getCurrentFocusCycleRoot();
    final Timer timer = new Timer(delay, null);
    timer.addActionListener(new ActionListener() {
        private int n = 0;
        @Override
        public void actionPerformed(ActionEvent e) {
            Container currentRoot = FocusManager.getCurrentManager().getCurrentFocusCycleRoot();
            if (callerRoot != currentRoot && currentRoot instanceof JDialog) {
                JDialog serviceDialog = (JDialog) currentRoot;
                serviceDialog.setIconImage(icon);
                timer.stop();
            } else if (n >= maxCount)
                timer.stop();
        }
    });
    timer.start();
}

Image icon = ...;
changePrintDialogIcon(icon);
PrinterJob pj = PrinterJob.getPrinterJob();
pj.printDialog(new HashPrintRequestAttributeSet());

Играйте со значениями delay и maxCount в соответствии с вашими потребностями. Конечно, всегда есть куда развиваться.

Очевидно, что Timer должен быть запущен перед любым вызовом printDialog. Например, это также работает, если таймер запускается перед вызовом JTable.print(), когда showPrintDialog равен true.

Я рад, что у меня есть решение для вопроса без ответа в течение многих лет :) (по крайней мере, в моем проекте).

...