Выровнять строки в столбцах в JTextArea

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

Снимок экрана того, что у меня есть

Таким образом, строки, напечатанные в каждой строке, печатаются из объекта Paper, который имеет параметры (id, title, author, date, rank). Данные считываются из текстового файла и сохраняются в LinkedList с помощью функции loadPaper().

Затем функция displayPapers() используется для отображения содержимого объекта Paper в JTextArea. displayPapers() указан ниже:

/** Print all Paper object present in the LinkedList paperList to textArea */
public void displayPapers(){
    // clear textArea before displaying new content
    displayTxtArea.setText("");

    Paper currentPaper;
    ListIterator<Paper> iter = paperList.listIterator();

    while(iter.hasNext()){
        currentPaper = iter.next();
        String line = currentPaper.toString();

        if("".equals(line)){
            continue;
        } // end if

        String[] words = line.split(",");
        displayTxtArea.append   ("  " 
                                + padString(words[0],30) 
                                + padString(words[1],30) 
                                + "    " 
                                + padString(words[2],30) 
                                + "  " 
                                + padString(words[3],30)  
                                + padString(words[4],30) 
                                + "\n");

        System.out.println(words);
        //displayTxtArea.append(currentPaper.toString());
    } // end while

    displayTxtArea.append("  Total " + noOfPapers + " entries!");

} // end showAllPaper

Функция padString() добавляет пробелы в строку, чтобы все они имели одинаковое количество слов. PadString() указан ниже:

/** Add spaces to Strings so that all of the are of same number of characters
 *  @param str  String to be padded
 *  @param n    total number words String should be padded to
 * @return str  Padded string 
 */
private String padString(String str, int n){
    if(str.length() < n){
        for(int j = str.length(); j < n; j++){
            str += " ";
        } // end for
    } // end if
    return str;
} // end padString

Я работал над этим некоторое время, но до сих пор не могу найти решение. Как вы можете заметить, на картинке выше не все идеально выровнено, как предполагалось.

Как их идеально выровнять, чтобы выглядело лучше? Спасибо.


person Subash    schedule 16.12.2011    source источник
comment
Почему бы вам не использовать JTable? Кажется более подходящим отображать данные в столбцах.   -  person JB Nizet    schedule 16.12.2011
comment
Я бы предпочел JTable, который даст вам возможность играть с размером столбца, его расположением и т. д.   -  person GETah    schedule 16.12.2011


Ответы (4)


Вывод будет выровнен «правильно» в вашем JTextArea, только если вы используете моноширинный шрифт. Например, Andale Mono 14 подойдет.

Кроме того, чтобы упростить себе жизнь и избежать ада заполнения, используйте String.format с его синтаксис.

String format = "%1$5s %2$-40s %3$-20s";
String someLine;
while (whatEver...) {
   ... 
   someLine = String.format(format, aNum, aName, aDate);
   jTextArea1.append(someLine + "\n");
}
person Costis Aivalis    schedule 16.12.2011
comment
Большое спасибо. Это то, что я драгоценно искал. Решает мою проблему. Ваше здоровье. - person Subash; 17.12.2011
comment
JTable может подойти, но использование JTextArea позволяет добавлять дополнительную неформатированную информацию в тот же компонент, а также, при необходимости, в другие таблицы. - person Costis Aivalis; 17.12.2011
comment
моноширинный делает это отлично. - person jmreader; 11.05.2017

Вместо этого используйте JTable (для того, что очевидно табличная информация). Дополнительные сведения и рабочие примеры см. в разделе Как использовать таблицы.

Демонстрация сортировки таблицы

person Andrew Thompson    schedule 16.12.2011

Вы можете использовать HTML с компонентом Swing или использовать JEditorPane.

JLabel jt=new JLabel();
jt.setText("<html>
            <table border='1'>
               <tr><th>No</th><th>Name</th></tr>
               <tr><td>1</td><td>Mr.A</td></tr></table></html>");
person kv-prajapati    schedule 16.12.2011

Вы также можете изменить шрифт JTextArea, если это разрешено в вашей задаче

textArea.setFont(new Font("monospaced", Font.PLAIN, 12));
person nikoo28    schedule 15.03.2016