2012-02-14 51 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(); 
    } 
}