Форматирование строки в текстовой области javafx с использованием escape-последовательностей - PullRequest
0 голосов
/ 13 сентября 2018

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

Как я могу сделать мой текущий вывод более отформатированным, желательно с использованием 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-последовательностей, но они не работают с текстовыми областями или чем-то еще.

1 Ответ

0 голосов
/ 13 сентября 2018

Я предлагаю вам использовать 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...