如何在JTable中对单元格的值进行对齐?

25

我不知道如何对齐 JTable 中的单元格值。

例如,JTable 显示:

   姓名      工资
   Mr.X      100000.50
   XXXX      234.34
   YYYy      1205.50

我想要将“工资”对齐成以下格式。

   Name      Salary
   Mr.X      100000.50
   XXXX         234.34
   YYYy        1205.50

如何将JTable置于上方对齐

7个回答

46

不需要为此创建自定义类,只需使用默认渲染器即可:

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

或者更好的方法是在表格中实际存储Double值,然后将使用适当的数字渲染器并且数字渲染器会自动右对齐。然后,您可以使用表格格式渲染器自定义数字的格式。


1
正确的常量名称是DefaultTableCellRenderer.RIGHT,请参见本主题中@Adrian的帖子(或SwingConstats.RIGHT)。 - xmedeko

12

我们需要进行小的更正,正确的方式是 DefaultTableCellRenderer.RIGHT

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

注意与camickr的原始响应的差异,“Price”是列的名称,根据情况更改。


1
RIGHT 实际上是在 SwingConstants 接口中定义的(JLabel 和 DefaultTableCellRenderer 都实现/继承了该接口)。因此,任何这些前缀都可以为您提供 RIGHT 的值...但为了清晰起见,为什么不直接使用 SwingConstants.RIGHT 呢?或者,如果您感觉想要确保手头的渲染器是“RIGHT”,那么可以使用 rightRenderer.RIGHT。 - gwideman
4
SwingConstants.RIGHT 是恰当的常量。 - Erick Robertson
2
事实上,当使用DefaultTableCellRenderer.RIGHT时,Eclipse会发出警告:“静态字段SwingConstants.RIGHT应直接访问”。 - Zach Olivare

5

一种简单的方法是使用DefaultTableModel并重写方法getColumnClass()
例如:

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

如果你返回Integer,你的列将右对齐,如果返回String,你的列将左对齐。

这是一个糟糕的解决方案,因为它欺骗了渲染器,让它认为它正在处理一个与实际不同的类,这可能会在以后引起问题。请参见答案。 - Neph

4

来自这个论坛帖子

创建一个继承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;
}

并安装此渲染器用于相关列。

现在您只需要确保每个值具有相同数量的小数位,因为对于大多数字体,所有数字都具有相同的宽度。


3

我有一个方法可以将表格中的列右对齐:

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

0

关于一次操作多个表,我成功地做到了这一点...就像@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);
        }
    }

0

处理这个问题的方法是为每一列指定一个自定义单元格渲染器。每个渲染器将以不同的方式格式化数据(名称将靠左对齐,小数将靠右对齐,...)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接