#java #user-interface #printing
#java #пользовательский интерфейс #печать
Вопрос:
Я пытаюсь написать некоторый код, который будет печатать некоторые числа с выравниванием по правому краю, но заметил, что при наличии более одной цифры форматирование перепутывается и все отбрасывается. Я также заметил, что Strings
я пытаюсь напечатать, также не выравнивается правильно.
Вот мой код:
public class Printer implements Printable
{
Object[][] data;
String lines;
public Printer(Object[][] data)
{
this.data = data;
lines = convertArrayToString();
PrinterJob job = PrinterJob.getPrinterJob();
PageFormat pf = job.defaultPage();
Paper paper = new Paper();
paper.setImageableArea(9, 9, paper.getWidth() - (9 * 2), paper
.getHeight());
PrintRequestAttributeSet attributes =
new HashPrintRequestAttributeSet();
attributes.add(OrientationRequested.LANDSCAPE);
job.setPrintable(this, pf);
boolean ok = job.printDialog();
if (ok)
{
try
{
pf.setOrientation(PageFormat.LANDSCAPE);
job.print(attributes);
} catch (PrinterException ex)
{
/* The job did not successfully complete */
}
}
}
@Override
public int print(Graphics g, PageFormat pf, int page)
throws PrinterException {
if (page > 0)
return NO_SUCH_PAGE;
Graphics2D g2d = (Graphics2D) g;
g2d.translate(pf.getImageableY(), pf.getImageableX());
g.setFont(new Font("ARIAL", Font.PLAIN, 11));
drawString(g, lines, 10, 10);
return PAGE_EXISTS;
}
private void drawString(Graphics g, String message, int x, int y)
{
for (String line : message.split("n"))
g.drawString(line, x, y = g.getFontMetrics().getHeight());
}
private String convertArrayToString() {
String line = "ID | REVERB | GAIN | PRESENCE | MIDDLE | "
" BASS | ARTIST NAME | AMPLIFIER NAME "
"|n"
"------------------------------------------------------------"
"------------"
"------------------------------------------------------------"
"-------------------------n";
for (int i = 0; i < data.length; i )
{
String currentLine = "";
currentLine = String.format(" - | - | "
"- | - | - |"
" - |0s |0s |n", data[i][0], data[i][1],
data[i][2], data[i][3], data[i][4], data[i][5], data[i][6],
data[i][7]);
line = currentLine;
}
return line;
}
}
Если у кого-нибудь есть какие-либо идеи относительно того, почему использование String.format()
метода работает только иногда, любой ввод будет оценен! Спасибо!
Комментарии:
1. В большинстве шрифтов, включая Arial, символы имеют разную ширину: заглавная буква W намного шире строчной буквы L. Самое простое решение — использовать
new Font(Font.MONOSPACED, Font.PLAIN, 11)
вместо этого, чтобы вы могли полагаться на символы, выстраивающиеся так, как они это делают в терминалах. См . en.wikipedia.org/wiki/Monospaced_font .2. Это была проблема! Большое вам спасибо 🙂
Ответ №1:
Исправление состояло в том, чтобы изменить Font
объект на new Font(Font.MONOSPACED, Font.PLAIN, 11)
, как VGR предложил выше.