K
Kipard
Gast
Hallo Forum,
ich schreibe an einem Programm, das in erste Linie einen Datensatz ausdrucken soll. Dazu möchte ich diesen Datensatz also Vorschau (über ein JPanel) anzeigen. Der Benutzer kann dann noch ein paar Optionen wählen und letztlich diesen Datensatz ausdrucken. Ich verwende eine Menge von Linien und Textblöcken, die ich auf ein Graphics2D Objekt zeichne. Bisher klappt das auch ganz gut, ich kann entweder auf ein Graphics eines JPanels malen (als Vorschau) oder auf das Graphics eines Druckers (um das Dokument tatsächlich auszudrucken). Leider stelle ich nun fest, dass die Methode FontMetrics.stringwidth("irgendeinTest") - unterschiedliche Längeninformationen zurück gibt. Die Schriftart und größe hab ich nicht verändern, ich vermute es liegt an den unterschiedlichen Graphics Objekten.
Nun zu meiner Frage: wie kann ich dafür sorgen, dass stringwidth für beide Graphics-Objekte dieselbe Information zurück gibt? Denn wenn sich Vorschau und Druck doch unterscheiden macht das ganze keinen Sinn.
Hier mein Minimalbeispiel. Zuerst wird das Dokument auf einem Drucker ausgegeben, danach (wenn man auf den entsprechenden Knopf clickt) wird es auf ein JPanel gezeichnet.
======= Dokument ========
======== GUI ===========
Ich hoffe irgendwer kann mir jetzt sagen ich muss irgendein RenderingHint oder sonst was setzen, damit sich beide Graphics Objekte gleich verhalten. Im Moment bin ich ein bischen verzweifelt, denn ich finde keine brauchbare Hilfe im Netz.
Vielen Dank schon im Voraus,
Stefan
ich schreibe an einem Programm, das in erste Linie einen Datensatz ausdrucken soll. Dazu möchte ich diesen Datensatz also Vorschau (über ein JPanel) anzeigen. Der Benutzer kann dann noch ein paar Optionen wählen und letztlich diesen Datensatz ausdrucken. Ich verwende eine Menge von Linien und Textblöcken, die ich auf ein Graphics2D Objekt zeichne. Bisher klappt das auch ganz gut, ich kann entweder auf ein Graphics eines JPanels malen (als Vorschau) oder auf das Graphics eines Druckers (um das Dokument tatsächlich auszudrucken). Leider stelle ich nun fest, dass die Methode FontMetrics.stringwidth("irgendeinTest") - unterschiedliche Längeninformationen zurück gibt. Die Schriftart und größe hab ich nicht verändern, ich vermute es liegt an den unterschiedlichen Graphics Objekten.
Nun zu meiner Frage: wie kann ich dafür sorgen, dass stringwidth für beide Graphics-Objekte dieselbe Information zurück gibt? Denn wenn sich Vorschau und Druck doch unterscheiden macht das ganze keinen Sinn.
Hier mein Minimalbeispiel. Zuerst wird das Dokument auf einem Drucker ausgegeben, danach (wenn man auf den entsprechenden Knopf clickt) wird es auf ein JPanel gezeichnet.
======= Dokument ========
Code:
import java.awt.Font;
import java.awt.Graphics;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
public class Dokument implements Printable {
public int print(Graphics g, PageFormat pageFormat, int pageIndex) throws PrinterException {
this.paint(g);
return PAGE_EXISTS;
}
public void paint(Graphics g) {
g.setFont(new Font("Arial", Font.PLAIN, 12));
System.err.println(g.getFontMetrics().stringWidth("Hallo Welt"));
}
}
======== GUI ===========
Code:
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.print.Book;
import java.awt.print.PageFormat;
import java.awt.print.Paper;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import java.lang.reflect.InvocationTargetException;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.attribute.HashPrintServiceAttributeSet;
import javax.print.attribute.PrintServiceAttributeSet;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Main extends JFrame {
private static final long serialVersionUID = 112787250344916458L;
public static JFrame frame;
public static JPanel z;
public static void main(String[] args) throws InterruptedException, InvocationTargetException {
javax.swing.SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
createAndShowGUI();
}
});
Book book = new Book();
PrinterJob printJob = PrinterJob.getPrinterJob();
PrintService private_druckerObjekt = null;
//richtigen Drucker festlegen
try {
PrintServiceAttributeSet aset = new HashPrintServiceAttributeSet();
PrintService[] colorServices = PrintServiceLookup.lookupPrintServices(null, aset);
for (int i = 0; i < colorServices.length; i++) {
if (colorServices[i].getName().equals("Win2PDF")) {
private_druckerObjekt = colorServices[i];
i = colorServices.length; //zum vorzeitigen Beenden der Schleife
}
}
printJob.setPrintService(private_druckerObjekt);
} catch (PrinterException e) {
System.err.println("Druckerfehler");
}
printJob.setJobName("test");
PageFormat documentPageFormat = printJob.defaultPage();
Paper papier = documentPageFormat.getPaper();
papier.setImageableArea(0, 0, papier.getWidth(), papier.getHeight());
documentPageFormat.setPaper(papier);
book.append(new Dokument(), documentPageFormat);
printJob.setPageable(book);
try {
printJob.print();
} catch (PrinterException e) {
e.printStackTrace();
}
}
private static void createAndShowGUI() {
JFrame.setDefaultLookAndFeelDecorated(true);
frame = new JFrame("test");
JButton laden = new JButton("testen!");
ActionListener eventLaden = new ActionListener() {
public void actionPerformed(ActionEvent e) {
Dokument d = new Dokument();
d.paint(z.getGraphics());
}
};
laden.addActionListener(eventLaden);
frame.setSize(500, 600);
frame.setLayout(new BorderLayout());
frame.add(laden, BorderLayout.NORTH);
//Display the window.
frame.pack();
frame.setVisible(true);
}
}
Ich hoffe irgendwer kann mir jetzt sagen ich muss irgendein RenderingHint oder sonst was setzen, damit sich beide Graphics Objekte gleich verhalten. Im Moment bin ich ein bischen verzweifelt, denn ich finde keine brauchbare Hilfe im Netz.
Vielen Dank schon im Voraus,
Stefan