【问题标题】:Align the values of the cells in JTable?对齐 JTable 中单元格的值?
【发布时间】: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如何对齐

【问题讨论】:

    标签: java jtable alignment


    【解决方案1】:

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

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

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

    【讨论】:

    • 正确的常量名称是DefaultTableCellRenderer.RIGHT,参见@Adrian 在此线程中的帖子。 (或SwingConstats.RIGHT)。
    【解决方案2】:

    我们需要做一个小修正,正确的方法是DefaultTableCellRenderer.RIGHT

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

    注意和camickr原来响应的不同,“Price”是列名,根据大小写变化。

    【讨论】:

    • RIGHT 实际上是在接口 SwingConstants 中定义的(JLabel 和 DefaultTableCellRenderer 都实现/继承)。因此,这些前缀中的任何一个都能为您提供 RIGHT 的值……但为了清楚起见,为什么不直接使用 SwingConstants.RIGHT?或者,如果您想绝对确定您拥有与手头的渲染器相关的“RIGHT”,您可以使用 rightRenderer.RIGHT。
    • SwingConstants.RIGHT 是适当的常量。
    • 其实在使用DefaultTableCellRenderer.RIGHT的时候,Eclipse会给出警告“静态字段SwingConstants.RIGHT应该直接访问”
    【解决方案3】:

    一个简单的方法是使用 DefaultTableModel 和覆盖方法 getColumnClass()
    例如:

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

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

    【讨论】:

    • 这是一个糟糕的解决方案,因为它诱使渲染器认为它正在处理与实际不同的类,这可能会在以后引起问题。请参阅this 答案。
    【解决方案4】:

    来自this forum post

    创建一个扩展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;
    }
    

    并为相关列安装此渲染器。

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

        解决方法是为每列指定一个自定义cell renderer。每个渲染器都会以不同的方式格式化该数据(名称将左对齐,小数右对齐,...)

        【讨论】:

          【解决方案7】:

          至于一次不止一张桌子,我设法做到了...正如@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);
                  }
              }
          

          【讨论】:

            猜你喜欢
            • 2013-10-03
            • 2016-02-04
            • 2023-04-02
            • 2013-12-19
            • 2014-01-10
            • 2021-12-28
            • 2013-12-16
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多