2012-02-14 45 views
2

我在編輯DefaultTableCellRenderer時遇到問題。如何在Java中編輯DefualtTableCellRenderer?

我想右對齊我的表中的第二列。但是,右下方的代碼將所有列對齊,而不僅僅是第二個!

任何人都可以看到我要去哪裏錯了嗎?

for (int i=0; i < tblMenu.getModel().getColumnCount(); i++) 
{ 
    DefaultTableCellRenderer renderer = 
     (DefaultTableCellRenderer) tblMenu.getCellRenderer(i, 1); 

    renderer.setHorizontalAlignment(JTextField.RIGHT); 
} 

回答

3

您可以使用匿名內部類替換表上的默認渲染器。像下面的(未經測試)代碼的東西可能會奏效:

table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() { 
     @Override 
     public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
      if (column == 2) { 
       setHorizontalAlignment(JTextField.RIGHT); 
      } 
      return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
     } 

    }); 
+1

因爲它是一個渲染器共享對於「Object」類型的所有列,您應該重置「else」分支中的對齊方式。事實上,我將存儲該值('Component c = super.getTableCellRenderer ...'),設置對齊並返回組件,所以在超級調用中不能覆蓋對齊。 – 2012-02-14 23:50:30

+0

謝謝你的回答很有幫助,有用,如果我願意,我也可以稍後調整它! = D – geekman92 2012-02-15 01:05:37

+0

哦,他是,你是對的,你需要添加一個在那裏扭轉變化! = D – geekman92 2012-02-15 01:13:30

1

所有列在默認情況下使用相同的渲染器,您需要提供不同配置的一個列要更改:

DefaultTableCellRenderer righty = new DefaultTableCellRenderer(); 
righty.setHorizontalAlignment(JTextField.RIGHT); 

tblMenu.getColumnModel().getColumn(1).setCellRenderer(righty); 

也許比A Lee的方式簡單一些(取決於你正在做的其他定製)。

+0

非常感謝你的回答,它完美地工作,並描述爲什麼我的工作不正常!不過,我要給阿李一個最好的答案!雖然謝謝! = d – geekman92 2012-02-15 01:00:48

1

您可以設置特定列的單元格渲染器。您只需獲取表格的columnModel,然後獲取特定列,然後爲該列調用setCellRenderer。

但更容易的是,如果您的列保存數字數據,只需覆蓋表模型的getColumnClass(...)即可返回該列的Integer.class,並且表格將爲您正確格式化。或者,如果你知道你的表將不會是空的,乾脆讓表的數據告訴世界它是什麼類型的類型,讓JTable的渲染東西最好應:

// if the table isn't empty, this will work. 
class MyDTableModel extends DefaultTableModel { 
    public Class<? extends Object> getColumnClass(int c) { 
    return getValueAt(0, c).getClass(); 
    } 
}