Drucken von JPanel

TDO88

Bekanntes Mitglied
Hallo Zusammen,

ich habe ein JPanel mit einem Balkendiagramm und einem Textfield, zwecks Legende.
Dieses versuche ich nun zu drucken. Hab dazu im Netz auch einiges gefunden, dennoch will es nicht so richtig funktionieren.
Ich versuche es mit folgendem Code:

Java:
public void doPrint()
    {
        Toolkit tk = Toolkit.getDefaultToolkit();
        PrintJob pj = tk.getPrintJob(new Frame(), "", null);
        if(pj != null)
        {
            Graphics2D g2d = (Graphics2D) pj.getGraphics();
            this.paint(g2d);
            g2d.dispose();
            pj.end();
        }
    }

Die Zeile Graphics2D g2d = (Graphics2D) pj.getGraphics(); habe ich sehr häufig im Internet dafür gefunden, aber dabei bekomme ich folgende Exception:
java.lang.ClassCastException: sun.print.ProxyPrintGraphics cannot be cast to java.awt.Graphics2D

Zu der Exception finde ich leider wiederum fast nichts im Inet, was irgendwie passt. Hat also jemand von euch eine Idee, was an dem Code angepasst werden muss, oder einen komplett neuen Ansatz um mein JPanel zu drucken?!

Gruß
TDO
 
Hi,

danke für den Link! Hab das so umgesetzt und es funktioniert auch... leider habe ich wohl vorher einen Fehler gemacht und dachte, dass sowohl mein Balkendiagramm, als auch mein Textfield auf dem Panel sind, was sie aber wohl nicht sind. Beim drucken des Panels wird nur das Panel an sich und das Textfield gedruckt. Mein Balkendiagramm kommt leider nicht aus dem Drucker.
Meine Klasse sieht so aus:
Java:
public class BarChart extends JFrame
{
    public BarChart( String applicationTitle , String chartTitle , AxisInformations[] AvValues, String[] Parameter, double AvAngle)
    {
        super( applicationTitle );       
        JFreeChart barChart = ChartFactory.createBarChart(
            chartTitle,          
            "Axis",           
            "Average Values[µm]",           
            createDataset(AvValues, Parameter, AvAngle),         
            PlotOrientation.VERTICAL,          
            true, true, false);
     
        JPanel Legende = new JPanel();
        JMenuBar menuBar = new JMenuBar();
        JMenu Datei = new JMenu("Datei");
        menuBar.add(Datei);
        JMenuItem Print = new JMenuItem("Drucken");
        ActionListener l = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                doPrint(Legende);
            }
        };
        Print.addActionListener(l);
        Datei.add(Print);
        setJMenuBar(menuBar);
        
        ChartPanel chartPanel = new ChartPanel( barChart );       
        chartPanel.setPreferredSize(new java.awt.Dimension( Parameter.length * 150 , 600 ) );       
       
        JTextArea text = new JTextArea();
       
        //Füllen der Text Area...

        text.setEditable(false);
        text.setPreferredSize(new java.awt.Dimension(360, 180));
        text.setBorder(BorderFactory.createEmptyBorder(0,10,10,10));
        Legende.add(text);
        Container contPane = getContentPane();
        contPane.add(chartPanel, BorderLayout.NORTH);
        contPane.add(Legende, BorderLayout.SOUTH);
       
       
    }
    private CategoryDataset createDataset( AxisInformations[] AveValues, String[] Parameter, double AvAngle)
    {
        ...

        return dataset;
    }
   
    public void doPrint(JPanel PrintPanel)
    {
        PrinterJob pjob = PrinterJob.getPrinterJob();
        PageFormat preformat = pjob.defaultPage();
        preformat.setOrientation(PageFormat.LANDSCAPE);
        PageFormat postformat = pjob.pageDialog(preformat);
        if (preformat != postformat)
        {
            try{
                //Set print component
                pjob.setPrintable(new Printer(PrintPanel), postformat);
                if (pjob.printDialog()) {
                    pjob.print();
                }
            }catch(PrinterException pe){
                JOptionPane.showMessageDialog(this, pe.getMessage());
            }
        }
       
    }
}

Wie kann ich denn das gesamte angezeigte Fenster ausdrucken?!

Gruß
TDO
 
Hab es jetzt noch mal mit folgender Methode probiert:
Java:
    public void doPrint(Container contPane)
    {   
        Toolkit tk = Toolkit.getDefaultToolkit();
        PrintJob pj = tk.getPrintJob( new Frame(), "BarChart", null );
        if ( pj != null )
        {
            Graphics g = pj.getGraphics();
            contPane.printComponents( g );
            g.dispose();
          
            pj.end();
        }

Leider sendet mir die Methode wohl einen Auftrag an den Drucker, welcher aber dauerhaft beim Drucker in der Warteschlange hängt. Wenn ich mein Programm schließe, springt der Druckauftrag in: "An Drucker gesendet" aber das wars leider. Der Drucker tut nichts und der Status des Druckauftrags ändert sich ebenfalls nicht....
Wäre wirklich für jede Hilfe dankbar!
 

Zurück
Oben