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

时间:2018-09-13 17:58:52

标签: javafx

一个非常简单的问题,但我无法一生解决。我正在连接到数据库并选择一个表,并将表内容输出到文本区域。它可以工作,但是如果表的内容之一较长或较短,则输出将全部聚集在一起。

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

这是我当前的代码:

   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数学

在这里看起来可能还不错,但是以表格形式看起来有点胡扯。我想是因为有标签。我尝试使用一些转义序列,但不适用于文本区域或其他内容。

1 个答案:

答案 0 :(得分: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