2013-05-06 2 views
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); 
    } 
} 

넷빈즈 내가 때이 추상 메소드 위해서 print (Graphics, PageFormat, int)를 재정의하고 있지 않다라고 나에게 이야기하고 @Override 그것은 아무것도하지 나에게 말한다 :

는 코드입니다. 또한

라인 :이 그래픽 형식을 변환 할 수 없다는

Graphics2D g2d = (Graphics2D)g; 

오류가 부족합니다. 나는이 정확한 코드가 일주일 전에 일했기 때문에 잘못된 것을하고있다.

+0

어디에서'Graphics' 객체를 얻고 있습니까? 'Graphics2D' 오브젝트를 직접 취득 해, 그것을 파라미터로서 받아들이도록 (듯이) 메소드를 설정할 수 있습니까? – Pietu1998

+1

문제의 원인인지는 모르겠지만'g'에서'g2d'까지 검사하지 않은 캐스트가 있습니다. 코드가 변경되었지만 일주일 전과는 다른 입력을받을 수 있습니다. 적어도 캐스팅 전에'if (g instanceof g2d) '를 추가합니다. 당신은 breakpoint를'g '의 런타임 타입을 검사하도록 설정할 수있다. – killscreen

+0

방금 ​​설명한 문제없이 코드를 컴파일했습니다. 나는 우리가 더 많은 정보를 필요로한다고 생각한다 ... – DannyMo

답변

2

이전에 비슷한 문제가있었습니다.

특정 컴파일러 버전/java 버전 조합에서 @Override 주석이 작동하지 않고 컴파일러 오류가 발생합니다. 제거하면 작동 할 것입니다.

@Override 주석이 java 5에 도입되어서 컴파일러와 java 버전> = 5를 모두 갖고 있기 때문에이 기능이 작동하지 않는 이유를 모르므로 완전한 대답으로 평가할 수 없습니다. 이유에 대해 우리에게 깨달을 수 있습니다.

4

Java 버전 문제와 비슷합니다. @Override은 Java 5에 추가되었지만 클래스의 대체 메소드에만 유효합니다. Java 6은 에 대한 지원을 추가하여 인터페이스 (Printable)에 메소드를 구현합니다.

또한 스윙 Graphics 인스턴스가 모두 실제로 Graphics2D 인스턴스가되어 Java 1.2부터 캐스트가 안전해야한다고 생각합니다. 따라서 캐스팅 오류가 발생하면 매우 오래된 Java 버전을 사용하고있을 것입니다.

어느 쪽이든, 난 당신이 적어도 자바 6

1

당신이 작동 @Override를 제거하면 사용하고 있는지 확인하기 위해 넷빈즈 구성을 확인 추천 할 것입니다.

1

Netbeans 설정 CLASSPATH가 변경되었거나 Swing jar의 Printable 클래스 파일이 손상되어 Java 컴파일러가 기본 클래스를 찾을 수없는 것 같습니다.

사용중인 Netbeans의 버전을 말하지 않았습니다. 다음은 OSX 용 7.2.1에 적용됩니다.

프로젝트 속성 (프로젝트 이름을 찾으려면 마우스 오른쪽 단추로 클릭)에서 라이브러리를 선택하고 JDK가 완전하고 유효한 컴퓨터에 JDK가 설정되어 있는지 확인하십시오. 시도해 볼 수도 있습니다 소스 | 외부 변경 사항을 검색하십시오 ..., JDK 매니페스트를 다시 읽어야합니다. 누락 된 참조에 대한 또 다른 권장 수정 사항은 IDE를 다시 시작하는 것입니다. 깨진 jar를 복구하기 위해 JDK를 다시 설치하는 것이 최종적인 시도입니다.

1

이것은 컴퓨터에서 문제없이 실행됩니다. 다른 사람들이 제안했듯이 NetBeans에 구성 문제가있는 것 같습니다. Java 자체에서 문제가 될 가능성은 낮지 만 그럼에도 불구하고 가능합니다.

어쨌든, 이런 종류의 문제 때문에 Eclipse 설치를 권장합니다.Eclipse에서 무언가가 실행되고 NetBeans가 아니라 NetBeans가 아닌 Eclipse에서 실행되거나 완전히 다른 오류가 발생하는 경우 이는 매우 밝아지는 경향이 있습니다.

+0

정말 깔끔한 관찰입니다. 두 개의 IDE가 합계보다 큽니다! – Gene

관련 문제