Name: bsC130419 Date: 07/17/2001
java version "1.4.0-beta"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.0-beta-b65)
Java HotSpot(TM) Client VM (build 1.4.0-beta-b65, mixed mode)
When I use java.awt.font.TextLayout to render text on my printer, the quality
of the text is bad as compared to when using java.awt.Graphics.drawString. The
following code illustrates the problem. I have seen the same behavior on JDK
1.3.1 and 1.4 beta. Interestingly, JDK 1.2.2 has bad print quality in both
cases.
I am printing from Windows 2000 to a HP OfficeJet T45.
Note that this bug effects the print quality of JEditorPane/JTextPane when i18n
is enabled, because javax.swing.text.GlyphPainter2 uses TextLayout.
public class TextLayoutTest {
private static java.awt.Component canvas = new Canvas();
public static void main( String args[]) {
try {
java.awt.Frame frame = new java.awt.Frame("TextLayoutTest");
frame.setLayout( new java.awt.BorderLayout());
frame.addWindowListener( new java.awt.event.WindowAdapter() {
public void windowClosing( java.awt.event.WindowEvent
event) {
System.exit(0);
}
});
frame.add( canvas, java.awt.BorderLayout.CENTER);
javax.swing.JButton printButton = new javax.swing.JButton("print");
printButton.addActionListener( new java.awt.event.ActionListener() {
public void actionPerformed( java.awt.event.ActionEvent e) {
try {
java.awt.print.PrinterJob printerJob =
java.awt.print.PrinterJob.getPrinterJob();
java.awt.print.Book book = new java.awt.print.Book
();
book.append( new PrintableAdapter( canvas),
printerJob.defaultPage());
printerJob.setPageable( book);
if( printerJob.printDialog()) {
printerJob.print();
}
}
catch( Throwable ex) {
ex.printStackTrace();
}
}
});
frame.add( printButton, java.awt.BorderLayout.SOUTH);
frame.pack();
frame.setVisible( true);
}
catch( Exception ex) {
ex.printStackTrace();
}
}
/**
* The drawing surface.
*/
static class Canvas extends java.awt.Component {
/**
* Restrict our size to our preferred size.
*/
public java.awt.Dimension getPreferredSize() {
java.awt.Dimension dim = new java.awt.Dimension( 200, 150);
return dim;
}
public java.awt.Dimension getMaximumSize() {
return getPreferredSize();
}
public java.awt.Dimension getMinimumSize() {
return getPreferredSize();
}
/**
* The goodies are here.
*/
public void paint( java.awt.Graphics graphicsArg) {
java.awt.Graphics2D graphics = (java.awt.Graphics2D)graphicsArg;
graphics.setColor( java.awt.Color.black);
String text = "The Java language provides special support for the
string concatentation operator";
java.awt.Font font = new java.awt.Font("serif",
java.awt.Font.PLAIN, 6);
graphics.setFont( font);
graphics.drawString( text, 0, 50);
java.text.AttributedString string = new java.text.AttributedString(
text);
string.addAttribute( java.awt.font.TextAttribute.FONT, font);
java.text.AttributedCharacterIterator iterator = string.getIterator
();
java.awt.font.LineBreakMeasurer measurer = new
java.awt.font.LineBreakMeasurer( iterator, graphics.getFontRenderContext());
float y = 100;
while( measurer.getPosition() < iterator.getEndIndex()) {
java.awt.font.TextLayout layout = measurer.nextLayout( getWidth
());
y += layout.getAscent();
layout.draw( graphics, 0, y);
y += layout.getDescent() + layout.getLeading();
}
}
};
/**
* Adapter for printing AWT components.
*/
static class PrintableAdapter implements java.awt.print.Printable {
private java.awt.Component component;
public PrintableAdapter( java.awt.Component componentArg) {
component = componentArg;
}
public int print( java.awt.Graphics graphicsArg,
java.awt.print.PageFormat pageFormat, int pageIndex) throws
java.awt.print.PrinterException {
java.awt.Graphics2D graphics = (java.awt.Graphics2D)graphicsArg;
graphics.translate( pageFormat.getImageableX(),
pageFormat.getImageableY());
graphics.setClip( 0, 0, (int)pageFormat.getImageableWidth(), (int)
pageFormat.getImageableHeight());
component.print( graphics);
return PAGE_EXISTS;
}
}
}
(Review ID: 128220)
======================================================================