String.format() некорректно работает с Printable (с использованием Graphics2D)

#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 предложил выше.