Форматирование строки в текстовой области javafx с использованием escape-последовательностей

Супер простой вопрос, но я не могу понять его всю жизнь. Я подключаюсь к базе данных, выбираю таблицу и выводю ее содержимое в текстовую область. Это работает, но вывод объединяется, если одно из содержимого таблицы длиннее / короче.

Как я могу сделать мой текущий вывод более отформатированным, желательно с помощью escape-последовательностей?

Вот мой текущий код:

   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

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

Используйте TableView.

Sedrick 13.09.2018 20:28
0
1
623
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

Другие вопросы по теме