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;
}