且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

根据JTable中的第一列值着色特定行?

更新时间:2023-12-03 11:26:22

您的渲染器根据传递给 prepareRenderer()参数选择颜色。谓词行%2 == 0 选择交替行进行着色,如图所示。您的问题意味着您实际上希望以第0列的值为基础着色, ID 。为此你需要检查 getValueAt(row,0)的结果。



确切的表述取决于你的模特。使用此所述。


I'm trying to color particular rows according to the first column values in JTable, but the code below colors the rows according to the row's index. My table has simply four columns. The first column has ID numbers. I need to color the rows according to these ID numbers. For example, if the first ID is 0 and the second is also 0, both of them should be "lightGray". Any idea, please?

table_1 = new JTable(){
    public Component prepareRenderer(TableCellRenderer renderer,int Index_row, int Index_col) {
        Component comp = super.prepareRenderer(renderer,Index_row, Index_col);
            //even index, selected or not selected
            if (Index_row % 2==0  &&  !isCellSelected(Index_row, Index_col)) {
                comp.setBackground(Color.lightGray);
            } else {
                comp.setBackground(Color.white);
            }
            return comp;
        }
    };

Here is how it looks now:

Your renderer is choosing the color based on the row parameter passed to prepareRenderer(). The predicate row % 2 == 0 selects alternating rows for shading, as shown in your picture. Your question implies that you actually want to base shading on the value of column zero, ID. For this you need to examine the result of the getValueAt(row, 0).

The exact formulation depends on your model. Using this example, the following renderer shades rows starting with the letter "T".

private JTable table = new JTable(dataModel) {

    @Override
    public Component prepareRenderer(TableCellRenderer renderer, int row, int col) {
        Component comp = super.prepareRenderer(renderer, row, col);
        int modelRow = convertRowIndexToModel(row);
        if (((String) dataModel.getValueAt(modelRow, 0)).startsWith("T")
            && !isCellSelected(row, col)) {
            comp.setBackground(Color.lightGray);
        } else {
            comp.setBackground(Color.white);
        }
        return comp;
    }
};

Addendum: @mKorbel helpfully comments on the need to convert between model and view coordinates when sorting is enabled, as discussed here.