2010-03-09 22 views
23

Non sono a conoscenza di come allineare i valori delle celle in JTable.Allinea i valori delle celle in JTable?

Per Ex, Gli spettacoli JTable, Nome Stipendio Mr.X 100.000,50 XXXX 234,34 YYYY 1205,50

voglio allineare i "stipendi" nel seguente formato.

Name  Salary 
    Mr.X  100000.50 
    XXXX   234.34 
    YYYy  1205.50 

Come allineare al di sopra della JTable

risposta

42

Non v'è alcuna necessità di creare una classe personalizzata per questo, basta usare il renderer di default:

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

O un approccio migliore è quello di archiviare valori Double nella tabella e poi una vera e propria renderer numerica sarà i renderer usati e numerici vengono automaticamente allineati correttamente. È quindi possibile personalizzare la formattazione del numero utilizzando Table Format Renderer.

+0

E come faccio allinearlo a destra durante l'editing? – pts

+0

Il nome costante corretto è 'DefaultTableCellRenderer.RIGHT', vedere il post di @ Adrian in questa discussione.(O 'SwingConstats.RIGHT'). – xmedeko

0

Il modo per andare a questo proposito è quello di indicare una consuetudine cell renderer per ogni colonna. Ogni renderer formatta i dati in modo diverso (nomi saranno ê allineato a sinistra, decimali a destra, ...)

4

Da this forum post:

Creare una classe che estende DefaultTableCellRenderer e implementare il metodo getTableCellRendererComponent(), qualcosa di simile :

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; 
} 

e installare questo renderer per la colonna in questione.

Ora è necessario solo assicurarsi che ogni valore abbia lo stesso numero di cifre decimali perché per la maggior parte dei caratteri tutte le cifre hanno la stessa larghezza.

3

ho un metodo che allinea una colonna in una tabella a destra:

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

Dobbiamo fare una piccola correzione, il modo giusto è DefaultTableCellRenderer.RIGHT

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

Notate la differenza con la risposta originale di camickr, "Prezzo" è il nome della colonna, cambia in base al caso.

+1

RIGHT è effettivamente definito nell'interfaccia SwingConstants (che JLabel e DefaultTableCellRenderer implementano/ereditano). Quindi uno qualsiasi di questi prefissi ti dà un valore per GIUSTO ... ma per chiarezza perché non usare solo SwingConstants.RIGHT? Oppure, se senti di voler essere assolutamente sicuro di avere il "DESTRA" che riguarda il renderer a portata di mano, puoi usare rightRenderer.RIGHT. – gwideman

+2

'SwingConstants.RIGHT' è la costante appropriata. –

+1

Infatti, quando si usa 'DefaultTableCellRenderer.RIGHT', Eclipse dà un avvertimento _" Il campo statico SwingConstants.RIGHT dovrebbe essere accessibile direttamente "_ –

4

Un modo semplice sta usando DefaultTableModel e override di metodo getColumnClass()
Es:

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

Se si ritorna Integer, la vostra colonna allineerà Anh destra se ritorno String la vostra colonna di sinistra si allinea.

0

come per più di un tavolo alla volta sono riuscito a fare questo ... la sua come @camickr postato, ma ho aggiunto le intestazioni troppo

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); 
     } 
    } 
Problemi correlati