2013-05-06 62 views
6

我遇到了打印圖形對象的代碼問題。這個確切的代碼大約一週前工作,現在當我在netbeans中打開文件時,它在執行時崩潰。打印圖形對象

這是代碼:

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的告訴我,我不重寫抽象方法打印(圖形,PageFormat中,INT)當我和@覆蓋告訴我它是什麼都不做。

也行:

Graphics2D g2d = (Graphics2D)g; 

錯誤出來說,它不能轉換圖形類型。我不知道我做錯了什麼,因爲這個確切的代碼在一個星期前工作。

+0

你在哪裏得到'Graphics'對象?你能直接得到一個'Graphics2D'對象並設置方法來接受它作爲參數嗎? – Pietu1998 2013-05-06 15:54:43

+1

不知道如果這是你的問題的根源,但你必須從'g'到'g2d'未經檢查的演員。即使您的代碼已更改,它可能會獲得與一週前不同的輸入。我至少會在演員陣前添加一個'if(g instanceof g2d)';你也可以設置一個斷點來檢查'g'的運行時類型。 – killscreen 2013-05-06 16:03:18

+0

我剛剛編譯了你的代碼,沒有提到你描述的任何問題。我認爲,我們需要更多的信息.​​.. – DannyMo 2013-08-09 04:06:13

回答

2

我前段時間有類似的問題。

在某個編譯器版本/ java版本組合中,@Override註釋不起作用並且出現編譯器錯誤。如果你刪除它,它會起作用。

這不能作爲一個完整的答案,因爲我不知道它不工作的原因,因爲@Override註釋是在java 5中引入的,而且我的編譯器和java版本都大於等於5。可以啓發我們的理由。

4

這聽起來像是Java版本問題。在Java 5中添加了@Override,但僅適用於重寫類的方法。 Java 6增加了對@Override的支持來實現接口上的方法(其中Printable是)。

此外,我認爲所有Swing Graphics傳遞的實例現在實際上都是Graphics2D實例,因此從Java 1.2開始應該是安全的。因此,如果您收到了投射錯誤,那麼您可能正在使用一個非常舊的Java版本?

無論哪種方式,我建議你檢查你的Netbeans的配置,以確保您使用至少6的Java

1

如果刪除@Override它將工作。

1

聽起來好像你的NetBeans配置CLASSPATH改變了,或者Swing jar中的Printable類文件被破壞了,所以Java編譯器找不到基類。

你沒有說你使用的是哪個版本的Netbeans。以下適用於OSX的7.2.1。

在項目屬性中(右鍵單擊項目名稱以找到它),選擇Libraries並確保您的計算機上的JDK設置爲一個確定完整且有效的JDK。您也可以嘗試來源|掃描外部更改...,它應該重新讀取JDK清單。重新啓動IDE是缺少引用的另一個建議修復程序。重新安裝JDK來修復損壞的jar是最後一件嘗試。

1

這在我的機器上沒有問題。正如其他人所建議的那樣,NetBeans中可能存在配置問題。它不太可能是Java本身的問題,但仍有可能。

無論如何,對於這類問題,我建議安裝Eclipse。如果某些東西在Eclipse中運行,而不是NetBeans,或者NetBeans而不是Eclipse,或者您只是得到完全不同的錯誤,則它往往非常具有啓發性。

+0

這是一個非常整潔的觀察。兩個IDE不僅僅是它們的總和! – Gene 2013-08-15 14:59:51