Fråga
Finns det något sätt att dumpa innehållet i ett JFrame-fönster till en fil av typen .txt, .rtf (ev. .html) eller liknande, så filen kan öppnas av någon som inte har tillgång till mitt Java-program. (JFrame-fönstret innehåller ett flertal JTextPane-objekt.)
Svar
Hej Ulf, i Java är det ganska lätt att skriva ut vad som syns på skärmen till en postscript-fil.
Börja med att implementera interfacet Printable för den JFrame-klass som skall vara sparbar. Alla klasser som följer detta interface måste tillhandahålla en metod som heter public int print(Graphics g,PageFormat pf,int pageIndex), varav tanken är att metoden skall rita direkt på g. Men som du säkert vet implementerar redan JFrame och dess contentPane en metod som heter paint, därför räcker det för oss att skicka g till getContentPane().paint(g).
Ok, så nu har vi en printable instans på plats, så nu är det dags att börja använda den med.
Börja därför med att skapa en PrintRequestAttributeSet som innehåller olika värden för den postscript-fil som skall skapas. Skapa därefter ett PrinterJob som får tillgång till ditt fönster genom metoden setPrintable.
Printerjobbet måste även ha tillgång till en service som hanterar postscript skapandet, detta gör vi genom att anropa PrinterJob.lookupStreamPrintServices(”application/postscript”) vilket listar tillgängliga klasser som kan skapa serviceobjekt för detta format. I vårt exempel listat nedan nöjer vi oss med första bästa och ställer in jobbet att använda den genom job.setPrintService().
Nu är allt uppsatt och det räcker att skicka vårt PrintRequestAttributeSet objekt till job.print() så kommer ditt fönster skrivas ut till en postscript-fil.
(Om man får problem med postscript och sitter i GNU/Linux miljö, så kan man installera ps2pdf, vilket konventerar postscript till pdf)
Hoppas det här löser ditt problem…
import java.io.*;
import java.awt.*;
import java.awt.print.*;
import javax.print.*;
import javax.print.attribute.*;
import javax.print.attribute.standard.*;
import javax.swing.*;
public class Testar extends JFrame implements Printable {
public Testar() {
super(”Testar”);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new BorderLayout());
add(new JButton(”Button”), BorderLayout.CENTER);
add(new JButton(”Another Button”), BorderLayout.EAST);
pack();
setVisible(true);
}
public static void main(String args[]) {
Testar t = new Testar();
t.print();
}
public int print(Graphics g,PageFormat pf,int pageIndex) {
if (pageIndex == 0) {
this.getContentPane().paint(g);
return Printable.PAGE_EXISTS;
} else {
return Printable.NO_SUCH_PAGE;
}
}
public void print() {
PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
aset.add(new Copies(1));
aset.add(new JobName(”My job”, null));
PrinterJob job = PrinterJob.getPrinterJob();
job.setPrintable(this);
StreamPrintServiceFactory []factories =
PrinterJob.lookupStreamPrintServices(”application/postscript”);
if (factories.length > 0) {
try {
FileOutputStream outstream = new FileOutputStream(”out.ps”);
job.setPrintService(factories[0].getPrintService(outstream));
job.print(aset);
System.out.println(”File written, look at the file and compare it with our GUI!”);
} catch (FileNotFoundException e) {
} catch (java.awt.print.PrinterException pe) { }
}
}
}
Källa: http://java.sun.com/javase/6/docs/technotes/guides/jps/spec/printing2d.fm1.html#999400