打印一个图形对象

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;

错误提示说无法转换图形类型。我不知道我做错了什么,因为这个完全相同的代码一周前还可以工作。

你从哪里获取Graphics对象?你能直接获取Graphics2D对象并将方法设置为接受该对象作为参数吗? - PurkkaKoodari
1
不确定这是否是您问题的源头,但您从gg2d存在未经检查的转换。即使您的代码已更改,它可能会获得与一周前不同的输入。我建议在转换之前至少添加一个if (g instanceof g2d); 您还可以设置断点以检查g的运行时类型。 - killscreen
我刚刚编译了你的代码,并没有遇到你所描述的任何问题。我认为我们需要更多的信息…… - DannyMo
1- 删除Netbeans缓存(在Windows中位于C:\ Users \ {you} \ AppData \ Local \ NetBeans \ Cache \ {version})。打开Netbeans并进行清理和构建。 2- 卸载NetBeans(删除缓存),重新安装Netbeans,再次尝试。 3- 卸载Java和Netbeans,重新开始... - MadProgrammer
请检查您的Java版本以及您设置了什么源兼容性。也许它是Java 5,在那里您不能在接口上使用@Override。否则,它可以在我的计算机上编译得很好。 - lpiepiora
显示剩余2条评论
5个回答

5
听起来像是Java版本问题。在Java 5中添加了@Override,但只适用于重写类的方法。Java 6还支持在接口上实现方法(其中包括Printable)。
此外,我认为所有传递的Swing Graphics实例都现在实际上是Graphics2D实例,所以自Java 1.2以来强制转换应该是安全的。因此,如果您遇到强制转换错误,那么可能是使用的Java版本过老?
无论如何,建议您检查Netbeans配置,确保至少使用Java 6。

2
我之前遇到过类似的问题。
在特定的编译器版本和Java版本组合中,@Override注释无效并会出现编译错误。如果将其删除,则可以正常工作。
由于我不知道为什么它不起作用,因此这不能被视为完整的答案,因为@Override注释是在Java 5中引入的,并且我的编译器和Java版本均大于等于5。也许其他人可以告诉我们原因。

1
如果您删除@Override,它将正常工作。

1
似乎您的Netbeans配置CLASSPATH发生了变化,或者Swing jar中的Printable类文件损坏,因此Java编译器无法找到基类。
您没有说明使用的Netbeans版本。以下适用于OSX的7.2.1版本。
在项目属性中(右键单击项目名称即可找到),选择Libraries并确保JDK设置为您机器上确定完整且有效的JDK。您还可以尝试Source | Scan for external changes...,这应该会重新读取JDK清单。重启IDE是修复缺失引用的另一个推荐方法。重新安装JDK以修复损坏的jar文件是最后尝试的事情。

1

这段代码在我的电脑上可以正常运行。正如其他人所建议的,你的NetBeans配置可能存在问题。虽然Java本身出现问题的可能性较小,但仍有可能。

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


这是一个非常好的观察。两个集成开发环境的价值超过它们各自的总和! - Gene

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接