2013-05-06 10 views
6

Występuje problem z kodem, który drukuje obiekt graficzny. Ten dokładny kod działał około tygodnia temu, a teraz, kiedy otwieram plik w netbeans, zawiesza się on po wykonaniu.Drukowanie obiektu graficznego

Jest to kod:

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 mówi mi, że nie jestem Zastępowanie abstrakcyjnej metody print (grafiki, PageFormat, int), gdy jestem i @Override mówi mi, że nie robi nic.

Również linia:

Graphics2D g2d = (Graphics2D)g; 

błędy odchodzący mówiąc, że nie można przekonwertować rodzajów grafiki. Nie mam pojęcia, co robię źle, ponieważ ten dokładny kod działał tydzień temu.

+0

Skąd czerpiesz obiekt 'Graphics'? Czy możesz uzyskać obiekt 'Graphics2D' bezpośrednio i ustawić metodę akceptacji tego jako parametru? – Pietu1998

+1

Nie wiem, czy to źródło problemu, ale masz odznaczoną obsadę od 'g' do' g2d'. Mimo że Twój kod się zmienił, może dostawać inne dane niż tydzień temu. Dodałbym przynajmniej "if (g instanceof g2d)" przed rzutowaniem; możesz również ustawić punkt przerwania, aby sprawdzić typ "g" podczas wykonywania. – killscreen

+0

Właśnie skompilowałem twój kod bez żadnych problemów, które opisałeś. Myślę, że potrzebujemy więcej informacji ... – DannyMo

Odpowiedz

2

Jakiś czas temu miałem podobny problem.

W przypadku pewnej kombinacji wersji kompilatora/wersji java adnotacja @Override nie działa i powoduje błąd kompilatora. Jeśli ją usuniesz, zadziała.

To nie może być wartościowana jako kompletna odpowiedź, ponieważ nie wiem, dlaczego to nie działa, ponieważ adnotacja @Override została wprowadzona w java 5, a ja miałem zarówno kompilator, jak i wersję Java> = 5. Może ktoś jeszcze może oświecić nas z powodu.

4

To brzmi jak problem z wersją Java. @Override został dodany w Javie 5, ale był ważny tylko w przypadku nadpisywania metod klas. Java 6 dodała obsługę dla @Override do implementowania metod na interfejsach (które są Printable).

Co więcej, uważam, że wszystkie instancje Swing Graphics są obecnie instancjami Graphics2D, więc obsada powinna być bezpieczna od wersji Java 1.2. Więc jeśli dostajesz błędy odlewania, to może używasz bardzo starej wersji Javy?

Tak czy inaczej, polecam sprawdzić konfigurację Netbeans aby upewnić się, że używasz przynajmniej Java 6.

1

Jeśli usuniesz @Override będzie działać.

1

Wygląda na to, że zmieniono konfigurację Netbeans CLASSPATH lub plik klasy Printable w słoiku Swing został uszkodzony w taki sposób, że kompilator Java nie może odnaleźć klasy podstawowej.

Nie powiedziałeś jakiej wersji Netbeans używasz. Poniższe dotyczy 7.2.1 dla OSX.

We właściwościach projektu (kliknij prawym przyciskiem myszy nazwę projektu, aby go znaleźć), wybierz Biblioteki i upewnij się, że JDK jest ustawiony na jeden na Twoim komputerze, który na pewno jest kompletny i prawidłowy. Możesz także wypróbować Źródło | Skanuj w poszukiwaniu zmian zewnętrznych ..., które powinny ponownie przeczytać manifest JDK. Ponowne uruchamianie IDE to kolejna zalecana poprawka dla brakujących odniesień. Ponowna instalacja JDK w celu naprawy uszkodzonego słoika jest ostatnią rzeczą do wypróbowania.

1

To nie stanowi problemu na moim komputerze. Jak sugerowali inni, wydaje się prawdopodobne, że masz problem z konfiguracją w NetBeans. Mniej prawdopodobne, że byłby to problem w samej Javie, ale mimo to możliwy.

W każdym przypadku z tego powodu zalecam zainstalowanie Eclipse.Jeśli coś działa w Eclipse, a nie w NetBeans, czy NetBeans, a nie w Eclipse, lub po prostu dostajesz zupełnie inne błędy, to wydaje się ono bardzo pouczające.

+0

To naprawdę zgrabna obserwacja. Dwa IDE to więcej niż ich suma! – Gene