6

グラフィックス オブジェクトを出力するコードに問題があります。この正確なコードは約 1 週間前に機能しましたが、現在、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 は、抽象メソッド print(Graphics,PageFormat,int) をオーバーライドしていないことを通知し、@Override は何もしていないことを通知します。

また、次の行:

Graphics2D g2d = (Graphics2D)g;

グラフィックタイプを変換できないというエラーが発生します。この正確なコードは1週間前に機能したため、何が間違っているのかわかりません。

4

5 に答える 5

5

Javaのバージョンの問題のようです。 @OverrideJava 5 で追加されましたが、クラスのメソッドをオーバーライドする場合にのみ有効でした。Java 6 では @Override、インターフェイスにメソッドを実装するためのサポートが追加されました (つまりPrintable)。

さらに、渡されたすべての SwingGraphicsインスタンスは実際にはGraphics2Dインスタンスになっているため、Java 1.2 以降、キャストは安全であるはずです。キャスト エラーが発生する場合は、非常に古いバージョンの Java を使用している可能性があります。

いずれにせよ、Netbeans の設定を調べて、少なくとも Java 6 を使用していることを確認することをお勧めします。

于 2013-08-13T19:24:27.003 に答える
2

少し前に同様の問題がありました。

特定のコンパイラ バージョンと Java バージョンの組み合わせで、@Overrideアノテーションが機能せず、コンパイラ エラーが発生します。それを取り除けば、それは機能します。

@Override注釈がJava 5で導入され、コンパイラとJavaバージョンの両方が> = 5であるため、機能しない理由がわからないため、これは完全な回答として評価することはできません。理由。

于 2013-08-13T08:04:18.427 に答える
1

削除すれば@Override動作します。

于 2013-08-14T19:13:23.900 に答える
1

これは私のマシンでは問題ありません。他の人が示唆しているように、NetBeans の構成に問題があるようです。Java 自体に問題がある可能性は低いですが、それでも可能です。

いずれにせよ、この種の問題には Eclipse をインストールすることをお勧めします。何かが NetBeans ではなく Eclipse で実行される場合、または Eclipse ではなく NetBeans で実行される場合、または単にまったく異なるエラーが発生する場合は、非常に明確になる傾向があります。

于 2013-08-15T02:44:46.643 に答える
1

Netbeans 構成の CLASSPATH が変更されたかPrintable、Swing jar 内のクラス ファイルが破損したため、Java コンパイラが基本クラスを見つけられなかったようです。

使用している Netbeans のバージョンについては言及していません。以下は、OSX の 7.2.1 に適用されます。

プロジェクトのプロパティ (プロジェクト名を右クリックして検索) で [ライブラリ] を選択し、JDK がマシン上で完全かつ有効であることを確認したものに設定されていることを確認します。ソース |を試すこともできます。JDK マニフェストを再読み込みする必要がある外部変更をスキャンします... 。IDE の再起動は、欠落している参照に対するもう 1 つの推奨される修正です。壊れた jar を修復するために JDK を再インストールすることは、最後に試すことです。

于 2013-08-15T00:46:16.287 に答える