Я печатаю ряд прямоугольников, которые я рисую на экране. Прямоугольники перекрываются так, что они выглядят как сетка строк и столбцов. На экране все выглядит так, как ожидалось.Java Printing Graphics Uniformity
Я пробовал различные способы печати (внедрение печати), но я не могу получить то же качество.
- Использование метода печати JComponents является зернистым (даже при буферизации).
- Перерисовывание непосредственно на метод печати Графический объект вызывает более темные линии, где перекрываются прямоугольники, и более легкие линии там, где они отсутствуют (независимо от альфа-композита). Я пробовал различные методы рендеринга с помощью этого метода.
- Печать сконфигурированного буферизованного изображения непосредственно на графике печати обеспечивает неизменное качество, но некоторые линии кажутся толще других, так что целая колонка или ряд будет иметь одну плотную границу вдоль одной стороны. Кто-нибудь знает, почему это может случиться?
@Override
public int print(Graphics graphics, PageFormat pageFormat, int pageIndex)
throws PrinterException {
if(pageIndex > 2) {
return Printable.NO_SUCH_PAGE;
}
RepaintManager currentManager = RepaintManager.currentManager(this);
currentManager.setDoubleBufferingEnabled(false);
Graphics2D g2d = (Graphics2D) graphics;
g2d.setRenderingHint(RenderingHints.KEY_RENDERING,
RenderingHints.VALUE_RENDER_QUALITY);
g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BICUBIC);
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING,
RenderingHints.VALUE_COLOR_RENDER_QUALITY);
g2d.setRenderingHint(RenderingHints.KEY_DITHERING,
RenderingHints.VALUE_DITHER_ENABLE);
g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL,
RenderingHints.VALUE_STROKE_NORMALIZE);
g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS,
RenderingHints.VALUE_FRACTIONALMETRICS_ON);
g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
g2d.scale(.5, .5);
if(pageIndex == 0) {
this.paint(g2d);
} else if(pageIndex == 1) {
g2d.drawImage(onScreenBuffer, null, 0, 0);
} else {
g2d.setColor(new Color(51, 98, 140));
g2d.setStroke(new BasicStroke(1f));
//GridCell inherits from Rectangle2D.Double
for (final GridCell cell : model.getCells()) {
g2d.draw(cell);
}
}
return Printable.PAGE_EXISTS;
}
Проверьте, как вы построение буферизованного изображения, особенно любое DrawLine или методов FillRect. Как вы говорите, построение собственного буферизованного изображения даст самые последовательные результаты печати. –
пожалуйста, почему currentManager.setDoubleBufferingEnabled (false); – mKorbel
@mrKorbel - Я читал, что двойная буферизация JComponents может негативно повлиять на печать при вызове JComponent.print(). – Dodd10x