Выровнять строки по столбцам в JTextArea - PullRequest
7 голосов
/ 16 декабря 2011

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

Screen shot of what I have got so far

Таким образом, строки, напечатанные в каждой строке, печатаются из объекта Paper, который имеет параметры (идентификатор, название, автор, дата, ранг). Данные читаются из текстового файла и сохраняются в 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

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

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

Ответы [ 4 ]

9 голосов
/ 16 декабря 2011

Вывод будет выровнен «правильно» в вашей 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");
}
8 голосов
/ 16 декабря 2011

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

Table Sort Demo

6 голосов
/ 16 декабря 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>");
2 голосов
/ 15 марта 2016

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

textArea.setFont(new Font("monospaced", Font.PLAIN, 12));
...