【问题标题】:How change foreground color in a specific row from a default jtable如何从默认 jtable 更改特定行中的前景色
【发布时间】:2014-06-09 19:52:30
【问题描述】:

我的应用程序中有一个默认的 jtable。我想做一些检查,并更改第一列等于关闭的所有行的颜色。

我一直在尝试这样做,我们得到的最多的是:

 String x =  jTable.getModel().getValueAt(0, 0).toString();

    if(x.equals("close")) 
 {
     jTable.setForeground(Color.red);
      }

但是按照我的方式,改变所有线条的颜色。并且只检查表格的第一个元素。

我喜欢做所有的检查行,只更改第一列等于 close 的那些。

有人可以帮帮我吗?

感谢您能给我的所有帮助。

您好。

【问题讨论】:

标签: java swing jtable


【解决方案1】:

您必须实现TableCellRenderer。查看来自 oracle 的 JTabel 教程的 Using Custom Renderers。

【讨论】:

    【解决方案2】:

    您需要使用TableCellRenderer。这个组件就像一个橡皮图章,可以在表格上移动并在需要时绘制单元格 - 不像 Swing 中的普通组件在一个位置有很长的使用寿命。

    这是您可以在桌子上使用的示例。

    class MyTableCellRenderer extends JLabel implements TableCellRenderer {
        @Override
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            if (table.getModel().getValueAt(row, 0).equals("close")) {
                setForeground(Color.RED);
            } else {
                setForeground(Color.BLACK);
            }
            setText(String.valueOf(value));
            return this;
        }
    }
    
    public JTableFrame() {
        JTable table = new JTable();
        // Give your table some data:
        // table.setModel(new BlahTableModel());
    
        // Install the renderer on all columns
        MyTableCellRenderer renderer = new MyTableCellRenderer();
        table.getColumnModel().getColumn(0).setCellRenderer(renderer);
        table.getColumnModel().getColumn(1).setCellRenderer(renderer);
    
    
        getContentPane().add(BorderLayout.CENTER, new JScrollPane(table));
    }
    

    【讨论】:

    • 通常您不会从头开始实现 TableCellRenderer(您会错过所有必要的配置,例如 selected、dnd...),尤其是当您实现与 DefaultXX 相同的错误时(扩展组件与扩展组件)使用组件)
    【解决方案3】:
    public Component getTableCellRendererComponent(JTable table,
        Object value,
        boolean isSelected,
        boolean hasFocus, 
        int row, int column) 
    {
     Component cell = super.getTableCellRendererComponent(table, value, isSelected,
            hasFocus, row, column);
     String str = combo.getSelectedItem().toString();
     if (value.toString().equalsIgnoreCase(str))
     {
        cell.setBackground(Color.RED);
     }
     else
     {
        cell.setBackground(null);
     }
    
     return cell;
    }
    

    【讨论】:

    • 最好在调用super之前进行自定义颜色设置(避免DTCR臭名昭著的颜色记忆)
    【解决方案4】:

    查看Table Row Rendering,它比使用自定义渲染器更简单,因为您无需担心为表中的每种数据类型创建自定义渲染器。

    【讨论】:

    • 请注意,仅链接的答案... :) 当您建议您的变体时,一如既往:为应用程序需求子类化 JTable(或任何其他 JSomething)是 evil - 覆盖如果您有某种支持可配置视觉装饰的插件机制,prepareRenderer 是一个很好的解决方案。
    【解决方案5】:

    您可以在其中以红色显示过期行的应用示例,因为“Fecha Vencimiento”列的日期早于现在(2021/10/10)。因此,其余行显示为黑色。

    private notificationContractjTable = new javax.swing.JTable();
            
    private void configurarJTable() {
         JTableHeader th = notificationContractjTable.getTableHeader();
         Font fuente = new Font("Arial", Font.PLAIN, 20);
         th.setFont(fuente);
         notificationContractjTable.setRowHeight(25);
         notificationContractjTable.setDefaultRenderer(Object.class, new MyTableCellRenderer());
    }
            
    private class MyTableCellRenderer extends JLabel implements TableCellRenderer {
         @Override
         public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
              if (((LocalDate) table.getModel().getValueAt(row, 2)).isBefore(LocalDate.now())) {
                  setForeground(Color.RED);
              } else {
                  setForeground(Color.BLACK);
              }
              setText(String.valueOf(value));
              return this;
         }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-18
      • 2011-04-21
      • 2013-05-22
      • 1970-01-01
      • 2013-11-03
      • 2022-01-15
      • 2012-01-02
      相关资源
      最近更新 更多