Avatar billede danco Nybegynder
03. maj 2010 - 13:17 Der er 10 kommentarer og
1 løsning

Print grafik objekt

Hejsa,
jeg sidder og arbejder på en Java applikation hvor jeg skal have printet data ud som jeg har præsenteret på et JPanel.
jeg har googlet rundt men det ser ikke ud til at virke for mig med at implementere Printable interfacet.
Jeg ville helst holde mig til at bruge panel.getGraphics() og så printe det ud.
jeg håber at i kan se hvor jeg vil hen og at nogen har tid og lyst til at give et hint eller en stump kode.
Avatar billede arne_v Ekspert
03. maj 2010 - 15:20 #1
Hvordan forsoger du at udskrive din Printable?

Arne
Avatar billede danco Nybegynder
03. maj 2010 - 18:36 #2
jeg har forsøgt med mig at typecaste et grafik objekt til Printable på følgende måde:

(Printable)panel.getGraphics()

Er det svar på dit spørgsmål?
Avatar billede arne_v Ekspert
03. maj 2010 - 19:29 #3
Graphics implementerer saa vidt jeg kan se ikke Printable, saa du faar vel en ClassCastException.
Avatar billede arne_v Ekspert
03. maj 2010 - 19:34 #5
Jeg kan godt poste mit "hello world" eksempel paa print, men de links er langt bedre.
Avatar billede danco Nybegynder
05. maj 2010 - 17:45 #6
Jeg har læst på alle de der links før jeg postede spørgsmål her. men synes ikke rigtig at det går igennem.

Min fejlfinding er dog nået så langt at problemet ligger i at udskrive et grafik objekt, hvilket jeg troede var nødvendigt.
Har du eventuelle alternativer måder at opnå samme resultat?

Lige pt. har jeg et panel på en frame, på panelet skriver jeg en masse Strings via drawString() metoden. Og derfor ville jeg helst beholde det på den måde for ikke at lave alt for meget om i min klasse.
Avatar billede arne_v Ekspert
05. maj 2010 - 20:55 #7
Specielt det foerste link er da lige ud af landevejen.

Men her kommer et eksempel paa kode uden og med print.

Uden:


import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class GUI1 extends JFrame {
    private JPanel some;
    private JButton prt;
    public GUI1() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        getContentPane().setLayout(new BorderLayout());
        setTitle("GUI #1");
        some = new Demo1();
        getContentPane().add(some, BorderLayout.CENTER);
        prt = new JButton("Print");
        prt.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(GUI1.this, "Printer ikke");
            }
        });
        getContentPane().add(prt, BorderLayout.SOUTH);
        pack();
    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame f = new GUI1();
                f.setVisible(true);
            }
        });
    }
}

class Demo1 extends JPanel {
    public Demo1() {
        this.setPreferredSize(new Dimension(200,200));
    }
    @Override
    public void paintComponent(Graphics g) {
        g.drawString("Det virker OK !!", 20, 20);
    }
}


Med:


import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class GUI2 extends JFrame implements Printable {
    private JPanel some;
    private JButton prt;
    public GUI2() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        getContentPane().setLayout(new BorderLayout());
        setTitle("GUI #2");
        some = new Demo2();
        getContentPane().add(some, BorderLayout.CENTER);
        prt = new JButton("Print");
        prt.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(GUI2.this, "Printer");
                // Add this code:
                PrinterJob job = PrinterJob.getPrinterJob();
                job.setPrintable(GUI2.this);
                if (job.printDialog()) {
                    try {
                        job.print();
                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }
                }
                // ====
            }
        });
        getContentPane().add(prt, BorderLayout.SOUTH);
        pack();
    }
    // Add this method:
    @Override
    public int print(Graphics g, PageFormat pf, int pix) throws PrinterException {
        super.print(g);
        return pix == 0 ? PAGE_EXISTS : NO_SUCH_PAGE;   
    }
    // ====
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame f = new GUI2();
                f.setVisible(true);
            }
        });
    }
}

class Demo2 extends JPanel {
    public Demo2() {
        this.setPreferredSize(new Dimension(200,200));
    }
    @Override
    public void paintComponent(Graphics g) {
        g.drawString("Det virker OK !!", 20, 20);
    }
}


1) tilfoej implements Printable
2) tilfoej print kode i actionPerformed
3) lav simpel printComponents metode
Avatar billede danco Nybegynder
17. maj 2010 - 13:43 #8
Hejsa arne,
jeg takker for din hjælp, men jeg har valgt en anden og mere hensigtsmæssig metode.
Hvis du smider svar skal du naturligvis nok få point som tak for din tid.
Avatar billede arne_v Ekspert
17. maj 2010 - 14:40 #9
ok
Avatar billede arne_v Ekspert
17. maj 2010 - 14:40 #10
Er din loesning noget som andre ville kunne have nyte af at vide lidt om?
Avatar billede danco Nybegynder
17. maj 2010 - 22:06 #11
Hermed dine point arne.
Jamen dette skulle være brugt i forbindelse med en eksamensopgave på mit datamatiker studie, her er det min undervisers holdning at kontakt med printer ligger over niveau på 2. semester og derfor er det endnu ikke gennemgået.
Min gruppe og jeg har derfor valgt en mere simpel løsning i form af at gemme data i en alm. textfil. Dette er blandt andet på grund af sværhedsgraden men ligeledes grundet tidspres.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester