Hallo!
Ich arbeite an einer Klasse PrintPreview, welches die Vorschau für ein Pageable-Objekt am Screen anzeigen soll.
Der Zoom (scale) passt sich im Beispiel der Fenstergröße an.
Dabei fiel mir auf, dass sich hier die Schriften nicht (wie bei einem PDF) stufenlos vergrößern.
Wenn man das Fenster größer zieht, die Schriften vergrössern sich sprunghaft.
Besonders deutlich wird es, wenn man (im Beispiel) auf die Enden der Zeilen schaut: Zeile 3 ist mal kürzer, mal länger als Zeile 2.
Gibt es in Java2D keine richtige Unterstützung von skalierbaren Fonts, dass sich eine Druckvorschau auch wirklich so stufenlos vergrößert anzeigen lässt wie in einem PDF-Reader?
Mein Code dazu:
(Fürs Beispiel verwende ich deshalb einen Code mit static-Klassen, weil man so mit nur einer .java-Datei auskommt).
Grüße
Egon Schmid
Ich arbeite an einer Klasse PrintPreview, welches die Vorschau für ein Pageable-Objekt am Screen anzeigen soll.
Der Zoom (scale) passt sich im Beispiel der Fenstergröße an.
Dabei fiel mir auf, dass sich hier die Schriften nicht (wie bei einem PDF) stufenlos vergrößern.
Wenn man das Fenster größer zieht, die Schriften vergrössern sich sprunghaft.
Besonders deutlich wird es, wenn man (im Beispiel) auf die Enden der Zeilen schaut: Zeile 3 ist mal kürzer, mal länger als Zeile 2.
Gibt es in Java2D keine richtige Unterstützung von skalierbaren Fonts, dass sich eine Druckvorschau auch wirklich so stufenlos vergrößert anzeigen lässt wie in einem PDF-Reader?
Mein Code dazu:
Java:
package printpreview;
import java.awt.*;
import java.awt.geom.*;
import java.awt.print.*;
import java.util.logging.*;
import javax.swing.*;
/**
*
* @author JavaBar
*/
public class Preview {
// Beginn PrintPreview
static class PrintPreview extends JComponent {
private Pageable pageable;
private int pageNo;
public PrintPreview(Pageable pageable) {
this.pageable = pageable;
pageNo = 0;
}
public int getPageNo() {
return pageNo;
}
public void setPageNo(int pageNo) {
this.pageNo = pageNo;
repaint();
}
@Override
protected void paintComponent(Graphics graphics) {
int w = getWidth();
int h = getHeight();
graphics.setColor(new Color(33, 33, 33));
graphics.fillRect(0, 0, w, h);
Printable p = pageable.getPrintable(pageNo);
PageFormat format = pageable.getPageFormat(pageNo);
double pw = format.getWidth();
double ph = format.getHeight();
Graphics2D g = (Graphics2D) graphics;
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
double scaleX = w / pw;
double scaleY = h / ph;
double sc = scaleX < scaleY ? scaleX : scaleY;
g.scale(sc, sc);
g.setColor(Color.WHITE);
g.fill(new Rectangle2D.Double(0.0, 0.0, format.getWidth(), format.getHeight()));
try {
p.print(graphics, pageable.getPageFormat(pageNo), pageNo);
} catch (PrinterException ex) {
Logger.getLogger(PrintPreview.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
// Ende PrintPreview
// Beginn Document
static class Document implements Pageable, Printable {
PageFormat pageFormat;
static final float mm = 72f / 25.4f;
public Document() {
pageFormat = new PageFormat();
Paper paper = new Paper();
paper.setSize(120 * mm, 50 * mm);
paper.setImageableArea(0.0, 0.0, paper.getWidth(), paper.getHeight());
pageFormat.setPaper(paper);
}
@Override
public int getNumberOfPages() {
return 1;
}
@Override
public PageFormat getPageFormat(int pageIndex) throws IndexOutOfBoundsException {
return pageFormat;
}
@Override
public Printable getPrintable(int pageIndex) throws IndexOutOfBoundsException {
return this;
}
@Override
public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) {
Graphics2D g = (Graphics2D) graphics;
Font f1 = new Font("Arial", Font.PLAIN, 1);
g.setColor(Color.BLACK);
g.setFont(f1.deriveFont(48f));
g.drawString("Lorem ipsum", 10, 48);
g.setFont(f1.deriveFont(24f));
g.drawString("dolor sit amet", 20, 70);
g.setFont(f1.deriveFont(13.9f));
g.drawString("consectetur adipisici elit", 20, 82);
g.setFont(f1.deriveFont(14.4f));
g.drawString("consectetur adipisici elit", 20, 95);
g.setFont(f1.deriveFont(6f));
g.drawString("sed diam nonumy eirmod tempor invidunt ut labore et dolore magna", 20, 103);
return PAGE_EXISTS;
}
}
// Ende Document
public static void main(String[] args) {
JFrame f = new JFrame("Druckvorschau");
f.setBounds(10, 10, 300, 200);
f.setLayout(new BorderLayout());
f.add(new PrintPreview(new Document()), BorderLayout.CENTER);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
}
(Fürs Beispiel verwende ich deshalb einen Code mit static-Klassen, weil man so mit nur einer .java-Datei auskommt).
Grüße
Egon Schmid