使用转义序列格式化textarea javafx中的字符串

问题描述 投票:0回答:1

超级简单的问题,但我无法弄清楚我的生活。我正在连接到数据库并选择一个表并将表内容输出到文本区域。它可以工作,但如果表中的一个内容更长/更短,则输出会全部聚集。

如何使用转义序列更好地格式化当前输出?

这是我目前的代码:

   ta.appendText(rsMetaData.getColumnName(i)+ " \t"); //outputs the table column names

       while (rSet.next()) { // this outputs the tables contents 
        for (int i = 1; i <= rsMetaData.getColumnCount(); i++) {
            ta.appendText(rSet.getObject(i) + " \t");
        }
        ta.appendText("\n");        
    }

当前输出看起来像这样

deptName chairID collegeID deptID 生物学111221118 SC BIOL 化学111221119 SC CHEM 计算机科学111221115 SC CS 数学111221116 SC MATH

它在这里可能看起来不错,但在表格中看起来有点废话。我想这是因为标签。我尝试使用一些转义序列,但它不适用于文本区域或其他东西。

javafx
1个回答
1
投票

我建议你使用TableView。如果你不想使用TableView,那么这是一个简单的数学问题,并确保你使用Monospace字体。在这个示例应用程序中,我找到每列最长的单词。然后我确定需要将多少空格添加到比最长单词短的单词中。然后我再添加四个空格来创建一个完整的列。

用于将TextArea字体设置为等宽字体

textArea.setStyle("-fx-font-family: monospace");

用于在每列中找到最长的String

List<Integer> longestDataLengths = new ArrayList();//This variable is global

void findLongestDataLengthsForColumns(List<List<String>> fakeData)
{
    for (int i = 0; i < fakeData.size(); i++) {
        for (int ii = 0; ii < fakeData.get(i).size(); ii++) {
            if (i == 0) {
                longestDataLengths.add(fakeData.get(i).get(ii).length());
                //System.out.println("added: " + fakeData.get(i).get(ii));
            }
            else {
                //System.out.println("adding: " + i);;//+ fakeData.get(i).get(ii));
                if (fakeData.get(i).get(ii).length() > longestDataLengths.get(ii)) {
                    longestDataLengths.set(ii, fakeData.get(i).get(ii).length());
                }
            }
        }
    }
}

用于查找完成列长度所需的空格数

int numberOfSpacesNeeded(int longestLength, String entry)
{
    int numberOfSpaceAfterLongestLength = 4;

    System.out.println("space needed: " + (longestLength - entry.length() + numberOfSpaceAfterLongestLength));
    return longestLength - entry.length() + numberOfSpaceAfterLongestLength;
}

用于创建所需的额外空间/空间

String createSpace(int numberOfSpaces)
{
    StringBuilder spaces = new StringBuilder();

    for (int i = 0; i < numberOfSpaces; i++) {
        spaces.append(" ");
    }

    return spaces.toString();
}

完整的例子

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.TextArea;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

/**
 *
 * @author blj0011
 */
public class JavaFXApplication261 extends Application
{

    List<Integer> longestDataLengths = new ArrayList();

    @Override
    public void start(Stage primaryStage)
    {
//        for (List<String> line : getFakeDBData()) {
//            System.out.println(line);
//        }
        List<List<String>> fakeData = getFakeDBData();
        findLongestDataLengthsForColumns(fakeData);
//        for (Integer entry : longestDataLengths) {
//            System.out.println(entry);
//        }

        TextArea textArea = new TextArea();
        textArea.setStyle("-fx-font-family: monospace");
        for (List<String> line : fakeData) {
            for (int i = 0; i < line.size(); i++) {
                textArea.appendText(line.get(i) + createSpace(numberOfSpacesNeeded(longestDataLengths.get(i), line.get(i))));
            }
            textArea.appendText("\n");
        }

        StackPane root = new StackPane(textArea);

        Scene scene = new Scene(root, 300, 250);

        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args)
    {
        launch(args);
    }

    List<List<String>> getFakeDBData()
    {
        List<List<String>> fakeData = new ArrayList();

        String data = "deptName chairID collegeID deptID\n"
                + "Biology 111221118 SC BIOL\n"
                + "Chemistry 111221119 SC CHEM\n"
                + "Computer_Science 111221115 SC CS\n"
                + "Mathematics 111221116 SC MATH";

        for (String line : Arrays.asList(data.split("\n"))) {
            fakeData.add(Arrays.asList(line.split(" ")));
        }

        return fakeData;
    }

    //
    void findLongestDataLengthsForColumns(List<List<String>> fakeData)
    {
        for (int i = 0; i < fakeData.size(); i++) {
            for (int ii = 0; ii < fakeData.get(i).size(); ii++) {
                if (i == 0) {
                    longestDataLengths.add(fakeData.get(i).get(ii).length());
                    //System.out.println("added: " + fakeData.get(i).get(ii));
                }
                else {
                    //System.out.println("adding: " + i);;//+ fakeData.get(i).get(ii));
                    if (fakeData.get(i).get(ii).length() > longestDataLengths.get(ii)) {
                        longestDataLengths.set(ii, fakeData.get(i).get(ii).length());
                    }
                }
            }
        }
    }

    String createSpace(int numberOfSpaces)
    {
        StringBuilder spaces = new StringBuilder();

        for (int i = 0; i < numberOfSpaces; i++) {
            spaces.append(" ");
        }

        return spaces.toString();
    }

    int numberOfSpacesNeeded(int longestLength, String entry)
    {
        int numberOfSpaceAfterLongestLength = 4;

        System.out.println("space needed: " + (longestLength - entry.length() + numberOfSpaceAfterLongestLength));
        return longestLength - entry.length() + numberOfSpaceAfterLongestLength;
    }
}

结果 enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.