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 告诉我我没有重写抽象方法 print(Graphics,PageFormat,int) 而@Override 告诉我它什么也没做。

还有这行:

Graphics2D g2d = (Graphics2D)g;

错误说它不能转换图形类型。我不知道我做错了什么,因为这个确切的代码在一周前就起作用了。

4

5 回答 5

5

这听起来像一个Java版本问题。 @Override在 Java 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

听起来您的 Netbeans 配置 CLASSPATH 已更改或PrintableSwing jar 中的类文件已损坏,因此 Java 编译器无法找到基类。

您没有说您使用的是哪个版本的 Netbeans。以下适用于 OSX 的 7.2.1。

在项目属性中(右键单击项目名称以找到它),选择库并确保 JDK 在您的计算机上设置为您确定完整且有效的一个。你也可以试试Source | 扫描外部更改...,这应该重新读取 JDK 清单。重新启动 IDE 是针对缺少引用的另一个推荐修复方法。重新安装 JDK 以修复损坏的 jar 是最后的尝试。

于 2013-08-15T00:46:16.287 回答
1

这在我的机器上运行没有问题。正如其他人所建议的那样,您似乎在 NetBeans 中存在配置问题。它不太可能成为 Java 本身的问题,但仍有可能。

无论如何,对于这类问题,我建议安装 Eclipse。如果某些东西在 Eclipse 而不是 NetBeans 中运行,或者在 NetBeans 而不是 Eclipse 中运行,或者您只是得到完全不同的错误,它往往是非常有启发性的。

于 2013-08-15T02:44:46.643 回答
1

如果你删除@Override它会工作。

于 2013-08-14T19:13:23.900 回答