2013-05-06 36 views
6

Tôi gặp sự cố với mã của mình để in đối tượng đồ họa. Mã chính xác này đã hoạt động khoảng một tuần trước và bây giờ khi tôi mở tệp trong netbeans, nó bị treo trên thực thi.In một đối tượng đồ họa

Đây là mã:

package Project; 

import java.awt.*; 
import javax.swing.*; 
import java.awt.print.*; 

public class Print implements Printable { 
    private Component componentToBePrinted; 

    public static void printComponent(Component c) { 
    new Print(c).print(); 
    } 

    public Print(Component componentToBePrinted) { 
    this.componentToBePrinted = componentToBePrinted; 
    } 

    public void print() { 
    PrinterJob printJob = PrinterJob.getPrinterJob(); 
    printJob.setPrintable(this); 
    if (printJob.printDialog()) 
     try { 
     printJob.print(); 
     } catch(PrinterException pe) { 
     System.out.println("Error printing: " + pe); 
     } 
    } 

    @Override 
    public int print(Graphics g, PageFormat pageFormat, int pageIndex) { 
    if (pageIndex > 0) { 
     return(NO_SUCH_PAGE); 
    } else { 
     Graphics2D g2d = (Graphics2D)g; 
     g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY()); 
     disableDoubleBuffering(componentToBePrinted); 
     componentToBePrinted.paint(g2d); 
     enableDoubleBuffering(componentToBePrinted); 
     return(PAGE_EXISTS); 
    } 
    } 

    public static void disableDoubleBuffering(Component c) { 
    RepaintManager currentManager = RepaintManager.currentManager(c); 
    currentManager.setDoubleBufferingEnabled(false); 
    } 

    public static void enableDoubleBuffering(Component c) { 
    RepaintManager currentManager = RepaintManager.currentManager(c); 
    currentManager.setDoubleBufferingEnabled(true); 
    } 
} 

Netbeans nói với tôi rằng tôi không Trọng phương pháp in trừu tượng (Graphics, PageFormat, int) khi tôi và @ Override nói với tôi nó đang làm gì.

Cũng dòng:

Graphics2D g2d = (Graphics2D)g; 

lỗi ra nói rằng nó không thể chuyển đổi các loại đồ họa. Tôi không có ý tưởng những gì tôi đang làm sai vì mã chính xác này đã làm việc một tuần trước đây.

+0

Bạn lấy đối tượng 'Graphics' ở đâu? Bạn có thể nhận trực tiếp đối tượng 'Graphics2D' và đặt phương thức để chấp nhận đối tượng đó làm tham số không? – Pietu1998

+1

Không chắc chắn nếu đó là nguồn gốc của vấn đề của bạn, nhưng bạn có một diễn viên không được kiểm soát từ 'g' đến' g2d'. Mặc dù mã của bạn đã thay đổi, nó có thể nhận được các đầu vào khác với nó đã được một tuần trước đây. Tôi sẽ ít nhất thêm một 'if (g instanceof g2d)' trước khi cast; bạn cũng có thể đặt điểm ngắt để kiểm tra kiểu thời gian chạy của 'g'. – killscreen

+0

Tôi vừa biên soạn mã của bạn mà không có bất kỳ vấn đề nào bạn mô tả. Tôi nghĩ chúng ta cần thêm thông tin ... – DannyMo

Trả lời

2

Tôi đã gặp sự cố tương tự cách đây một thời gian.

Trong một phiên bản trình biên dịch phiên bản java nhất định, chú thích @Override không hoạt động và cung cấp lỗi trình biên dịch. Nếu bạn xóa nó, nó sẽ hoạt động.

Điều này không thể được coi là câu trả lời hoàn chỉnh vì tôi không biết lý do tại sao nó không hoạt động, vì chú thích @Override được giới thiệu trong java 5 và tôi có cả trình biên dịch và phiên bản java> = 5. Có thể người khác có thể khai sáng cho chúng tôi về lý do.

4

Có vẻ như vấn đề về phiên bản Java. @Override đã được thêm vào trong Java 5 nhưng chỉ hợp lệ cho các phương thức ghi đè của Lớp học. Java 6 đã thêm hỗ trợ cho @Override để triển khai các phương thức trên các giao diện (trong đó Printable là).

Hơn nữa, tôi nghĩ rằng tất cả các trường hợp Swing Graphics được truyền xung quanh tất cả bây giờ thực sự là Graphics2D trường hợp sao cho dàn diễn viên phải an toàn vì Java 1.2. Vì vậy, nếu bạn đang nhận được lỗi đúc, thì có lẽ bạn đang sử dụng một phiên bản Java cũ?

Dù bằng cách nào, tôi sẽ khuyên bạn nên kiểm tra cấu hình Netbeans của bạn để chắc chắn rằng bạn đang sử dụng ít nhất Java 6.

1

Nếu bạn loại bỏ @Override nó sẽ làm việc.

1

Có vẻ như cấu hình Netpath của bạn CLASSPATH đã thay đổi hoặc tệp lớp học Printable trong bình Swing bị hỏng do đó trình biên dịch Java không thể tìm thấy lớp cơ sở.

Bạn không nói phiên bản Netbeans nào bạn đang sử dụng. Các điều sau đây áp dụng cho 7.2.1 cho OSX.

Trong thuộc tính Project (nhấp chuột phải vào tên dự án để tìm), hãy chọn Thư viện và đảm bảo rằng JDK được đặt thành một trên máy của bạn mà bạn chắc chắn đã hoàn tất và hợp lệ. Bạn cũng có thể thử Nguồn | Quét các thay đổi bên ngoài ..., mà phải đọc lại bản kê khai JDK. Khởi động lại IDE là một sửa lỗi được đề nghị khác cho các tham chiếu bị thiếu. Cài đặt lại JDK để sửa chữa một cái lọ bị hỏng là một điều cuối cùng để thử.

1

Điều này không có vấn đề gì trên máy của tôi. Như những người khác đã đề xuất, có vẻ như bạn có vấn đề về cấu hình trong NetBeans. Ít có khả năng nó sẽ là một vấn đề trong Java chính nó, nhưng dù sao có thể.

Trong mọi trường hợp, đối với loại sự cố này, tôi khuyên bạn nên cài đặt Eclipse.Nếu một cái gì đó chạy trong Eclipse và không phải NetBeans, hoặc NetBeans và không phải Eclipse, hoặc bạn chỉ đơn giản là có được các lỗi hoàn toàn khác nhau, nó có xu hướng rất sáng.

+0

Đó là một quan sát thực sự gọn gàng. Hai IDE là nhiều hơn tổng của họ! – Gene

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