2010-12-29 21 views
8

Używam PrinterJob.printDialog(), aby umożliwić użytkownikowi wybór drukarki i zmianę różnych ustawień drukowania.Okno dialogowe drukowania Java (natywna) - zmień ikonę

Jednak okno dialogowe jest zawsze wyświetlane przy użyciu standardowej ikony Java Coffee Coffeecup, a nie tej z mojego głównego okna (JFrame).

Jak mogę zmienić ikonę dla tego okna dialogowego?

Używam następujący fragment kodu:

 
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 

Normalnie JDialog dziedziczy ikonę z „macierzystego” JFrame, ale w tym przypadku nie mogę przechodzić lub określ okna nadrzędnego do tego dialogowe

Używam java6

Odpowiedz

3

wydaje się, że a_horse_with_no_name będzie przebijał (jak my wszyscy) z okna drukowania bez niestandardowej ikony. :-)

Nawet okno dialogowe drukowania iReport pojawia się ze standardową ikoną filiżanki. Okno dialogowe drukowania nie zachowuje się jak JFileChooser lub JColorChooser. Na szczęście jest modalne.

Jeśli ikona zawraca Ci głowę, możesz utworzyć wokół niej klasę opakowania i opracować szczegóły zgodnie z własnymi upodobaniami.

Java6 API nie ma możliwości modyfikacji ikony. Będę mieszkać z kubkiem kawy przez jakiś czas i będę czekał na kolejną wersję JDK, która może zaoferować zachowanie takie jak JFileChooser.

+1

Dzięki! Nie odpowiedź, na którą liczyłem, ale przynajmniej mogę przestać się rozglądać. –

7

Nie znalazłem sposobu na zmianę ikony, ale tutaj jest jeden pośredni sposób na jej usunięcie.

Musisz określić DialogOwner za pomocą atrybutów drukowania. Powoduje to, że java.awt.Window nie używa domyślnej ikony 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. 

Mam nadzieję, że to pomoże ci na razie !!

Podczas gdy nadal szukam sposobu na ustawienie tego okna dialogowego drukowania. :)

+0

Dzięki, ikona rzeczywiście została usunięta w ten sposób. –

+0

- Ograniczenie dostępu: Konstruktor DialogOwner (klatka) jest niedostępny ze względu na ograniczenia w wymaganej bibliotece /usr/lib/jvm/java-6-sun-1.6.0.26/jre/lib/ \t rt.jar – AvrDragon

+0

Co to jest dla tego kodu dla Java 7, ponieważ nie mogłem go znaleźć. Znalazłem odniesienie w DialogTypeSelection, ale to nie zadziałało ... –

1

Znalazłem rozwiązanie/obejście problemu, aby zmienić ikonę okna dialogowego drukowania w języku Java (natywną) (, nie).

Oznacza to, że działa to w przypadku dialogowego drukowania, na przykład reprezentowanego przez 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()); 

Gra z delay i maxCount wartości w zależności od potrzeb. Oczywiście zawsze jest miejsce na poprawę.

Oczywiście, Timer musi zostać uruchomiony przed każdym połączeniem z numerem printDialog. Na przykład działa to również, jeśli timer jest uruchamiany przed wywołaniem JTable.print(), gdy showPrintDialog jest true.

Cieszę się, że mam rozwiązanie dla pytania bez odpowiedzi od lat :) (przynajmniej w moim projekcie).