Как посчитать количество вкладок нужно для покрытия строки - PullRequest
2 голосов
/ 26 апреля 2020

Я пытаюсь создать строку, расположив мои данные в два столбца.

        String s = "";
        List selectedItems = listView.getSelectionModel().getSelectedItems();
        s = s + (String) selectedItems.get(0);
        String t;
        for (int i = 1 ; i<selectedItems.size();i++){
            t = (String) selectedItems.get(i);
            if (i%2!=0){
                s = s + "\t\t\t";
            }
            else{
                s = s + "\n";
            }
                s = s + (String) t;
        }

Моя идея состоит в том, чтобы использовать такой код для этой задачи. но в зависимости от длины строк, я не могу получить второй столбец в одну строку.

Я думаю, что существует способ подсчета количества вкладок, необходимых для покрытия одной строки, и изменения количества дополнительных вкладок, которые я добавляю вместо добавления 3 вкладок к каждой строке. но я не могу понять, как считать это.

как я могу решить эту проблему?

текущие результаты:

one     two
three     four
five    six

ожидаемые результаты:

one     two
three   four
five    six

это результат после заполнения строка с "" общей длиной 30.

enter image description here

я только использую jfx для получения данных. itextPdf мы использовали для записи строки в pdf

Ответы [ 2 ]

0 голосов
/ 26 апреля 2020

Согласно этому документу у вас есть 3 варианта:

Если у вас есть такие данные:

public static final String[][] DATA = {
    {"John Edward Jr.", "AAA"},
    {"Pascal Einstein W. Alfi", "BBB"},
};

1: использовать таблицу

public void createPdf(String dest) throws IOException, DocumentException {
    Document document = new Document();
    PdfWriter.getInstance(document, new FileOutputStream(dest));
    document.open();
    PdfPTable table = new PdfPTable(2);
    table.setWidthPercentage(50);
    table.setHorizontalAlignment(Element.ALIGN_LEFT);
    table.setWidths(new int[]{5, 1});
    table.getDefaultCell().setBorder(Rectangle.NO_BORDER);
    table.addCell("Name: " + DATA[0][0]);
    table.addCell(DATA[0][1]);
    table.addCell("Surname: " + DATA[1][0]);
    table.addCell(DATA[1][1]);
    table.addCell("School: " + DATA[2][0]);
    table.addCell(DATA[1][1]);
    document.add(table);
    document.close();
}

2: использовать вкладки

public void createPdf(String dest) throws FileNotFoundException, DocumentException {
    Document document = new Document();
    PdfWriter.getInstance(document, new FileOutputStream(dest));
    document.open();
    document.add(createParagraphWithTab("Name: ", DATA[0][0], DATA[0][1]));
    document.add(createParagraphWithTab("Surname: ", DATA[1][0], DATA[1][1]));
    document.add(createParagraphWithTab("School: ", DATA[2][0], DATA[2][1]));
    document.close();
}

public Paragraph createParagraphWithTab(String key, String value1, String value2) {
    Paragraph p = new Paragraph();
    p.setTabSettings(new TabSettings(200f));
    p.add(key);
    p.add(value1);
    p.add(Chunk.TABBING);
    p.add(value2);
    return p;
}

3: использовать пробелы и моноширинный шрифт

public void createPdf(String dest) throws DocumentException, IOException {
    Document document = new Document();
    PdfWriter.getInstance(document, new FileOutputStream(dest));
    document.open();
    BaseFont bf = BaseFont.createFont(FONT, BaseFont.CP1250, BaseFont.EMBEDDED);
    Font font = new Font(bf, 12);
    document.add(createParagraphWithSpaces(font, String.format("%s: %s", "Name", DATA[0][0]), DATA[0][1]));
    document.add(createParagraphWithSpaces(font, String.format("%s: %s", "Surname", DATA[1][0]), DATA[1][1]));
    document.add(createParagraphWithSpaces(font, String.format("%s: %s", "School", DATA[2][0]), DATA[2][1]));
    document.close();
}

public Paragraph createParagraphWithSpaces(Font font, String value1, String value2) {
    Paragraph p = new Paragraph();
    p.setFont(font);
    p.add(String.format("%-35s", value1));
    p.add(value2);
    return p;
}
0 голосов
/ 26 апреля 2020

Для достижения желаемого результата вам не нужно ничего подсчитывать - вы просто используете System.out.printf:

public class Main {
    public static void main(String[] args) {
        System.out.printf("%-10s %-10s\n", "test", "test1");
        System.out.printf("%-10s %-10s\n", "longertest", "test2");
    }
}

Результат:

test       test1     
longertest test2  

Как упоминалось в комментарии - это не решит проблему, если используемый вами шрифт не будет моноширинным, поэтому я бы предложил также изменить шрифт.

    BaseFont bf = BaseFont.createFont(FONT, BaseFont.CP1250, BaseFont.EMBEDDED);
    Font font = new Font(bf, 12);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...