【发布时间】:2011-01-25 09:32:47
【问题描述】:
我不知道如何对齐 JTable 中单元格的值。
例如,Jtable 显示, 姓名 薪水 X先生 100000.50 XXXX 234.34 YYYy 1205.50
我想按以下格式对齐“薪水”。
Name Salary
Mr.X 100000.50
XXXX 234.34
YYYy 1205.50
如上JTable如何对齐
【问题讨论】:
我不知道如何对齐 JTable 中单元格的值。
例如,Jtable 显示, 姓名 薪水 X先生 100000.50 XXXX 234.34 YYYy 1205.50
我想按以下格式对齐“薪水”。
Name Salary
Mr.X 100000.50
XXXX 234.34
YYYy 1205.50
如上JTable如何对齐
【问题讨论】:
无需为此创建自定义类,使用默认渲染器即可:
DefaultTableCellRenderer rightRenderer = new DefaultTableCellRenderer();
rightRenderer.setHorizontalAlignment(SwingConstants.RIGHT);
table.getColumnModel().getColumn(???).setCellRenderer(rightRenderer);
或者更好的方法是将 Double 值实际存储在表中,然后使用适当的数字渲染器,数字渲染器会自动右对齐。然后,您可以使用Table Format Renderer 自定义数字的格式。
【讨论】:
DefaultTableCellRenderer.RIGHT,参见@Adrian 在此线程中的帖子。 (或SwingConstats.RIGHT)。
我们需要做一个小修正,正确的方法是DefaultTableCellRenderer.RIGHT
DefaultTableCellRenderer rightRenderer = new DefaultTableCellRenderer();
rightRenderer.setHorizontalAlignment(DefaultTableCellRenderer.RIGHT);
tableExample.getColumn("Price").setCellRenderer( rightRenderer );
注意和camickr原来响应的不同,“Price”是列名,根据大小写变化。
【讨论】:
SwingConstants.RIGHT 是适当的常量。
DefaultTableCellRenderer.RIGHT的时候,Eclipse会给出警告“静态字段SwingConstants.RIGHT应该直接访问”
一个简单的方法是使用 DefaultTableModel 和覆盖方法 getColumnClass()
例如:
DefaultTableModel model = new DefaultTableModel() {
@Override
public Class getColumnClass(int columnIndex) {
if (columnIndex == 0) {
return Integer.class;
} else {
return String.class;
}
}
};
如果您返回 Integer,您的列将右对齐;如果返回 String,您的列将左对齐。
【讨论】:
创建一个扩展DefaultTableCellRenderer 的类并实现getTableCellRendererComponent() 方法,类似于:
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;
}
并为相关列安装此渲染器。
现在您只需要确保每个值的小数位数相同,因为对于大多数字体,所有数字的宽度都相同。
【讨论】:
我有一种方法可以将表格中的列向右对齐:
private void alignRight(JTable table, int column) {
DefaultTableCellRenderer rightRenderer = new DefaultTableCellRenderer();
rightRenderer.setHorizontalAlignment(JLabel.RIGHT);
table.getColumnModel().getColumn(column).setCellRenderer(rightRenderer);
}
【讨论】:
解决方法是为每列指定一个自定义cell renderer。每个渲染器都会以不同的方式格式化该数据(名称将左对齐,小数右对齐,...)
【讨论】:
至于一次不止一张桌子,我设法做到了...正如@camickr 发布的那样,但我也添加了标题
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);
}
}
【讨论】: