首页 > 解决方案 > 突出显示特定行 JTable

问题描述

我知道以前有类似问题的主题,但即使有了它,我也无法解决我的问题。

所以问题是,当我向我的 JTable 添加一个新的空行时,我想用灰色突出显示它。所以它适用于第一行但是当我尝试添加第二行时,第二行将是白色的......

我尝试调试但没有成功,我没有发现我的错误。

这是突出显示一行的类:

class GrayWhiteRenderer extends DefaultTableCellRenderer {

    private int rowToColored;

    GrayWhiteRenderer(int rowToColored) {
        this.rowToColored = rowToColored;
        Color color = UIManager.getColor ( "table.row" );
    }
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
            if (UIManager.getColor ( "table.row" )==Color.GRAY) {
                c.setBackground(Color.GRAY.brighter());
            }
            else if(row == rowToColored) {
                c.setBackground(Color.GRAY.brighter());
            } else {
                c.setBackground(Color.WHITE);
            }
        return c;
    }
}

我将所有新行的索引存储在rowToAdd它的开头(例如:。- [19, 20, 21, -1, -1, ...]1 是知道何时必须停止查找是否必须突出显示更多):

while(rowToAdd[k]!=-1) {
    System.out.println("rowToAdd[k] : "+rowToAdd[k]);
    dataTable.setDefaultRenderer(Object.class, new GrayWhiteRenderer(rowToAdd[k]));
    k++;
}

这是一个测试它的类:

package Graphic;

import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;
import java.awt.event.*;

class Test implements Runnable, ActionListener {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Test());
    }

    JTable table;

    @Override
    public void run() {
        JFrame frame = new JFrame("Custom Cell Renderer");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        table = new JTable(new DefaultTableModel(0, 2) {
            @Override
            public Class<?> getColumnClass(int c) {
                return Object.class;
            }
        });

        class GrayWhiteRenderer extends DefaultTableCellRenderer {
            private int rowToColored;
            GrayWhiteRenderer(int rowToColored) {
                this.rowToColored = rowToColored;
            }
            @Override
            public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
                Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
                if (UIManager.getColor ( "table.row" )==Color.GRAY) {
                    c.setBackground(Color.GRAY.brighter());
                }
                else if(row == rowToColored) {
                    c.setBackground(Color.GRAY.brighter());
                } else {
                    c.setBackground(Color.WHITE);
                }
                return c;
            }
        }

        table.setDefaultRenderer(Object.class, new GrayWhiteRenderer(table.getRowCount()));
        table.setTableHeader(null);

        JButton btn = new JButton("Add Row");
        btn.addActionListener(this);

        JToolBar bar = new JToolBar();
        bar.setFloatable(false);
        bar.add(btn);

        JPanel content = new JPanel(new BorderLayout());
        content.add(bar, BorderLayout.NORTH);
        content.add(new JScrollPane(table), BorderLayout.CENTER);

        frame.setContentPane(content);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent ae) {
        int nextRow = table.getRowCount();
        DefaultTableModel model = (DefaultTableModel)table.getModel();
        model.addRow(new Object[] { "" + nextRow, "" + nextRow });
        for(int i=0; i<model.getColumnCount(); i++) {
            table.setDefaultRenderer(Object.class, new GrayWhiteRenderer(i));
        }
    }

}

标签: javaswingjtable

解决方案


所以,我已经修复了你的例子。这是您的代码和我的评论

@Override
public void actionPerformed(ActionEvent ae) {
    int nextRow = table.getRowCount();
    DefaultTableModel model = (DefaultTableModel) table.getModel();
    model.addRow(new Object[] {"" + nextRow, "" + nextRow});
    // the correct row is: nextRow. No loop required here.
    table.setDefaultRenderer(Object.class, new GrayWhiteRenderer(nextRow));
}

我还会更正您的渲染器以提供选择突出显示

class GrayWhiteRenderer extends DefaultTableCellRenderer {
    private int rowToColored;

    GrayWhiteRenderer(int rowToColored) {
        this.rowToColored = rowToColored;
    }

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row,
            int column) {
        Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        // As I know there is no value is registered for "table.row" in UIManager
        // so I've skipped the first condition
        if (row == rowToColored) {
            c.setBackground(Color.GRAY.brighter());
        } else {
            // use correct color depended on whether the cell is selected or not!
            c.setBackground(isSelected ? table.getSelectionBackground() : table.getBackground());
        }
        return c;
    }
}

推荐阅读