在从MySQL添加行时更改JTable的整个行颜色

时间:2016-07-27 19:09:15

标签: java mysql swing jtable

我有一个类似下面的JPanel

enter image description here

当用户在绘图表(LEFT)中选择一行时,事务表(RIGHT)中的数据是从MySQL结果集生成的。代码如下:

        tableModelTran.getDataVector().removeAllElements();
        if (rs.isBeforeFirst()) {
            while (rs.next()) {
                java.util.Vector data = new java.util.Vector();
                data.add(rs.getString(1));
                data.add(rs.getString(2));
                data.add(new java.text.SimpleDateFormat("dd/MM/yyyy").format(rs.getDate(3)));
                data.add(String.valueOf(new java.text.SimpleDateFormat("MMMM yyyy").format(rs.getDate(3))).toUpperCase());
                data.add(rs.getString(4));
                data.add(rs.getString(5));
                data.add(rs.getString(6));
                data.add(rs.getBoolean(7));
                tableModelTran.addRow(data);
            }

            performTotals();
        }

如果经过验证,我想将行的颜色更改为绿色。如果不是,则勾选列并保持无色。此外,如果用户更改列的值,则颜色应相应更新。任何和所有的帮助表示赞赏。

编辑:

我创建了一个类并将其添加到我的构造函数中,如下所示:

static class ColorRenderer extends javax.swing.table.DefaultTableCellRenderer {

    @Override
    public java.awt.Component getTableCellRendererComponent(javax.swing.JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        java.awt.Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

        if (value.equals(true)) {
            c.setBackground(java.awt.Color.GREEN);
        }

        return c;
    } 


public PlotDetailsWindow() {
    initComponents();
    ....
    ....
    transactionTable.setDefaultRenderer(Boolean.class, new ColorRenderer());
    ....
    ....
}

现在每当我点击左侧表格中的一行时,如果第一个值为false,则不会改变颜色,但如果为真,则只会更改“已验证”。列为绿色,然后如果值为true或false则无关紧要,它将始终为绿色。此外,复选框现在变为true / false。

enter image description here

1 个答案:

答案 0 :(得分:3)

  

如果经过验证,我想将行的颜色更改为绿色。列已打勾

查看Table Row Rendering

它显示如何覆盖prepareRenderer(...) JTable方法,根据行中的数据为整行着色。

覆盖此方法的基本结构如下:

JTable table = new JTable(...)
{
    public Component prepareRenderer(
        TableCellRenderer renderer, int row, int column)
    {
        Component c = super.prepareRenderer(renderer, row, column);

        //  add custom rendering here

        return c;
    }
};