Java 如何计算覆盖字符串所需的选项卡数

Java 如何计算覆盖字符串所需的选项卡数,java,string,itext,Java,String,Itext,我试图通过将数据排列在两列中来创建字符串 String s = ""; List selectedItems = listView.getSelectionModel().getSelectedItems(); s = s + (String) selectedItems.get(0); String t; for (int i = 1 ; i<selectedItems.size();i+

我试图通过将数据排列在两列中来创建字符串

        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;
        }
预期成果:

one     two
three   four
five    six
这是使用“”填充字符串后的结果,总长度为30


我只使用jfx获取数据。itextPdf us用于将字符串写入pdf,以获得所需的输出,您无需计算任何内容,只需使用
System.out.printf

公共类主{
公共静态void main(字符串[]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=新字体(bf,12);
根据文档,您有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;
}

警告:您正在使用原始类型
列表
。不要使用原始类型。始终提供必要的类型参数,例如
List
。这也会使您的类型转换变得不必要。该函数返回一个“对象”列表,无论如何,谢谢,但这不是这里的问题。不知道为什么有人会在没有注释的情况下投票接近。您是否考虑过使用空格而不是制表符?计算你需要多少空间会容易得多。此外,选项卡没有固定的长度。根据您的编辑器,它可能被配置为2、3、4甚至更多的空格。@VladislavVarslavans我考虑过使用空格。但是每个字母所占的空间是不同的。因此,即使拥有相同数量的字符也无助于解决这个问题。这似乎是一个答案,但这个问题是一个更大系统的一部分,我无法将我可以提供的数据类型更改为文本pdf,我只能提供一个string@Eshaka如果你的日常工作只是一个更大系统的一部分,那么必须有一些契约,一些定义,如何解释您的返回数据。如果此合同仅说明“返回字符串以某种方式添加到pdf”,而没有任何信息允许您估计结果格式,则您无法创建此类列。因此,您必须与代码调用您的代码的团队或系统架构师进行沟通,并讨论评估结果布局的选项。正如您在问题的图片中所看到的,使用的字体看起来是成比例的。不过,您的例程依赖于单空格字体。@mki这是一个很好的观点。但无论如何,在这种情况下,空间并不是解决方案。至少不是令人满意的。
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;
}