2010-03-09 9 views
23

Nie wiem, jak wyrównać wartości komórek w JTable.Wyrównanie wartości komórek w JTable?

Ex, JTable pokazy, Nazwa Wynagrodzenie Mr.X 100000,50 XXXX 234,34 rrrr 1205,50

Chcę wyrównać „zabiegi” w następującym formacie.

Name  Salary 
    Mr.X  100000.50 
    XXXX   234.34 
    YYYy  1205.50 

Jak wyrównać jak wyżej JTable

Odpowiedz

42

Nie ma potrzeby, aby utworzyć klasę niestandardową dla tego, wystarczy użyć domyślny renderer:

DefaultTableCellRenderer rightRenderer = new DefaultTableCellRenderer(); 
rightRenderer.setHorizontalAlignment(SwingConstants.RIGHT); 
table.getColumnModel().getColumn(???).setCellRenderer(rightRenderer); 

lub lepsze podejście jest rzeczywiście przechowywać wartości podwoi się w tabeli, a następnie właściwa renderujący numeryczna będzie rendery używane i numeryczne są automatycznie wyrównane do prawej. Następnie można dostosować formatowanie numeru za pomocą Table Format Renderer.

+0

I w jaki sposób dostosować go do prawej podczas edycji? – pts

+0

Poprawną nazwą stałej jest 'DefaultTableCellRenderer.RIGHT', patrz wpis @ Adrian w tym wątku.(Lub 'SwingConstats.RIGHT'). – xmedeko

0

droga o to, aby określić niestandardową cell renderer dla każdej kolumny. Każdy renderujący sformatuje te dane w różny sposób (imiona będą è wyrównany do lewej strony, z prawej strony dziesiętnych, ...)

4

Od this forum post:

utworzyć klasę, która rozciąga DefaultTableCellRenderer i wdrożenie metody getTableCellRendererComponent(), coś podobnego :

public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) 
{ 
    JLabel renderedLabel = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
    renderedLabel.setHorizontalAlignment(SwingConstant s.RIGHT); 
    return renderedLabel; 
} 

i zainstaluj ten renderer dla danej kolumny.

Teraz wystarczy się upewnić, że każda wartość ma tę samą liczbę miejsc dziesiętnych, ponieważ w przypadku większości czcionek wszystkie cyfry mają tę samą szerokość.

3

Mam metodę, która dostosowuje kolumnę w tabeli po prawej stronie:

private void alignRight(JTable table, int column) { 
    DefaultTableCellRenderer rightRenderer = new DefaultTableCellRenderer(); 
    rightRenderer.setHorizontalAlignment(JLabel.RIGHT); 
    table.getColumnModel().getColumn(column).setCellRenderer(rightRenderer); 
} 
8

Musimy zrobić małą korektę, właściwa droga jest DefaultTableCellRenderer.RIGHT

DefaultTableCellRenderer rightRenderer = new DefaultTableCellRenderer(); 
rightRenderer.setHorizontalAlignment(DefaultTableCellRenderer.RIGHT); 
tableExample.getColumn("Price").setCellRenderer(rightRenderer); 

Zauważ różnicę z oryginalną odpowiedzią camickr, "Cena" to nazwa kolumny, zmienia się w zależności od przypadku.

+1

PRAWO jest rzeczywiście zdefiniowane w interfejsie SwingConstants (które JLabel i DefaultTableCellRenderer implementują/dziedziczą). Zatem każdy z tych prefiksów ma wartość PRAWY ... ale dla jasności, dlaczego nie wystarczy użyć SwingConstants.RIGHT? Lub jeśli chcesz być absolutnie pewny, że masz "PRAWE", które odnosi się do renderera na wyciągnięcie ręki, możesz użyć rightRenderer.RIGHT. – gwideman

+2

'SwingConstants.RIGHT' jest odpowiednią stałą. –

+1

W rzeczywistości przy użyciu 'DefaultTableCellRenderer.RIGHT', Eclipse daje ostrzeżenie _" Pole statyczne SwingConstants.RIGHT powinno być dostępne bezpośrednio "_ –

4

Prostym sposobem jest użycie metody DefaultTableModel i zastąpić getColumnClass()
Ex:

DefaultTableModel model = new DefaultTableModel() { 
     @Override 
     public Class getColumnClass(int columnIndex) { 
      if (columnIndex == 0) { 
       return Integer.class; 
      } else { 
       return String.class; 
      } 
     } 
    }; 

Jeśli wrócisz Integer, twoja kolumna będzie wyrównać prawy Anh jeśli powrót String kolumnie będzie wyrównać lewo.

0

za więcej niż jednej tabeli na raz udało mi się to zrobić ... jej jako @camickr pisał ale dodaje nagłówki zbyt

DefaultTableCellRenderer rightRenderer_c = new DefaultTableCellRenderer(); 
    DefaultTableCellRenderer rightRenderer_h = new DefaultTableCellRenderer(); 
    rightRenderer_c.setHorizontalAlignment(javax.swing.JLabel.RIGHT); 

    for(JTable t : Tables){ //Tables is an ArrayList<JTable> 

     //for the headers : 
     rightRenderer_h = (DefaultTableCellRenderer) t.getTableHeader().getDefaultRenderer(); 
     rightRenderer_h.setHorizontalAlignment(javax.swing.JLabel.RIGHT); 

     //for cells : 
     for(int i=0; i < t.getColumnCount(); i++){ 
      t.getColumnModel().getColumn(i).setCellRenderer(rightRenderer_c); 
     } 
    }