2011-12-16 13 views
6

Chcę wydrukować ciągi znaków w JTextArea i odpowiednio je wyrównać. Trudno to wyjaśnić, więc prześlę zrzut ekranu z tego, co próbuję osiągnąć.Wyrównanie ciągów w kolumnach w JTextArea

Screen shot of what I have got so far

Więc Struny drukowane w każdej linii są drukowane z papieru, który obiekt parametry (id, tytuł, autor, data, pozycja). Dane są odczytywane z pliku tekstowego i są przechowywane w funkcji LinkedList using loadPaper().

Następnie funkcja displayPapers() służy do wyświetlania zawartości obiektu Paper na JTextArea. displayPapers() znajduje się na liście poniżej:

/** 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 

Funkcja padString() dodaje spacje na ciąg tak, że wszyscy mają taką samą liczbę słów. PadString() jest wymieniony poniżej:

/** 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 

Pracowałem nad tym przez jakiś czas, ale wciąż nie mogę znaleźć rozwiązania. Jak widać powyższe zdjęcie nie wszystko jest idealnie wyrównane zgodnie z przeznaczeniem.

W jaki sposób dopasować je idealnie, aby wyglądało ładniej? Dzięki.

+3

Dlaczego nie można użyć JTable? Bardziej odpowiednie wydaje się wyświetlanie danych w kolumnach. –

+1

Wolałbym wybrać JTable, które dadzą Ci elastyczność podczas gry z rozmiarem i położeniem kolumny itp. – GETah

Odpowiedz

7

Dane wyjściowe zostaną wyrównane "poprawnie" w JTextArea tylko w przypadku korzystania z czcionki jednoprzestrzennej. Na przykład "Andale Mono 14" załatwi sprawę.

Aby ułatwić sobie życie i uniknąć piekła, użyj String.format z jego numerem syntax.

String format = "%1$5s %2$-40s %3$-20s"; 
String someLine; 
while (whatEver...) { 
    ... 
    someLine = String.format(format, aNum, aName, aDate); 
    jTextArea1.append(someLine + "\n"); 
} 
+0

Wielkie dzięki. Właśnie tego szukałem. Rozwiązuje mój problem. Twoje zdrowie. – Subash

+0

JTable może być w porządku, ale przyklejenie do JTextArea pozwala na dodanie dodatkowych niesformatowanych informacji do tego samego komponentu, jak również do większej liczby tabel, jeśli to konieczne. –

+0

mono-spaced robi to doskonale. – jmreader

8

Zamiast tego należy użyć JTable (dla informacji pozornie tabelarycznych). Aby uzyskać więcej informacji, zobacz How To Use Tables & przykłady robocze.

Table Sort Demo

+1

To wygląda dobrze. Popatrzę na JTable. – Subash

6

Można użyć HTML ze składnikiem huśtawka lub użyj 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

Można również zmienić czcionkę JTextArea jeśli jest to dozwolone w swoim problemie

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

działa jak urok – Tony