2010-12-29 40 views
8

Tôi sử dụng PrinterJob.printDialog() để cho phép người dùng chọn máy in và thay đổi các cài đặt in khác nhau.Hộp thoại in Java (bản địa) - thay đổi biểu tượng

Tuy nhiên hộp thoại luôn được hiển thị bằng biểu tượng coffeecup Java chuẩn và không phải là hộp thoại từ cửa sổ chính của tôi (JFrame).

Làm cách nào để thay đổi biểu tượng cho hộp thoại đó?

Tôi đang sử dụng đoạn mã sau:

 
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 

Thông thường một JDialog thừa hưởng các biểu tượng từ "cha mẹ" JFrame, nhưng trong trường hợp này tôi không thể vượt qua hoặc chỉ định một cửa sổ cha mẹ cho rằng thoại

Tôi đang sử dụng Java6

Trả lời

3

Có vẻ như a_horse_with_no_name sẽ bị kẹt (như phần còn lại của chúng tôi) với hộp thoại in không có biểu tượng tùy chỉnh. :-)

Ngay cả hộp thoại in của iReport cũng xuất hiện với biểu tượng tách cà phê tiêu chuẩn. Hộp thoại in không hoạt động như JFileChooser hoặc JColorChooser. May mắn thay nó là phương thức.

Nếu biểu tượng làm phiền bạn quá nhiều, bạn có thể tạo lớp trình bao bọc xung quanh nó và tìm hiểu chi tiết theo cách bạn muốn.

Java6 API không cung cấp cách sửa đổi biểu tượng. Tôi sẽ sống với cốc cà phê trong một thời gian và sẽ đợi phiên bản tiếp theo của JDK có thể cung cấp một hành vi như JFileChooser.

+1

Cảm ơn! Không phải là câu trả lời tôi hy vọng, nhưng ít nhất tôi có thể ngừng nhìn xung quanh. –

7

Tôi chưa tìm thấy cách thay đổi biểu tượng, nhưng đây là một cách gián tiếp để xóa biểu tượng đó.

Bạn cần chỉ định DialogOwner qua các thuộc tính in. Điều này làm cho java.awt.Window không sử dụng biểu tượng Java mặc định.

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. 

Hy vọng điều này sẽ giúp bạn ngay bây giờ !!

Trong khi tôi tiếp tục tìm kiếm một số cách để định vị hộp thoại in này. :)

+0

Cảm ơn, biểu tượng thực sự bị xóa theo cách này. –

+0

- Hạn chế quyền truy cập: Không thể truy cập Trình xây dựng DialogOwner (Khung) do hạn chế đối với thư viện yêu cầu /usr/lib/jvm/java-6-sun-1.6.0.26/jre/lib/ \t rt.jar – AvrDragon

+0

Thế nào là mã cho điều này cho Java 7 vì tôi không thể tìm thấy nó. Tôi tìm thấy một tài liệu tham khảo trong DialogTypeSelection nhưng điều đó không làm việc ... –

1

Tôi đã tìm thấy giải pháp/giải pháp thay đổi biểu tượng hộp thoại in Java (không phải là bản địa).

Tức là, thao tác này cho hộp thoại in được biểu thị bằng sun.print.ServiceDialog, chẳng hạn.

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

Chơi với delaymaxCount giá trị theo nhu cầu của bạn. Tất nhiên, luôn luôn có chỗ để cải thiện.

Rõ ràng, Timer phải được bắt đầu trước khi có bất kỳ cuộc gọi nào đến printDialog. Ví dụ: điều này cũng hoạt động nếu bộ hẹn giờ được bắt đầu trước khi gọi JTable.print() khi showPrintDialogtrue.

Tôi rất vui vì tôi có giải pháp cho câu hỏi chưa được trả lời trong nhiều năm :) (ít nhất là trong dự án của tôi).

Các vấn đề liên quan