我有两个JTables tblOrderInfo和tblDetailInfo我想在tblDetailInfo行的基础上给tblOrderInfo行着色,我做了很多研究,发现了Rob Camick's文章和许多其他文章,但是它适用于基于静态值检查的着色,并且不适合我的JTable动态过滤情况。

我使用Rob的方法尝试了一个函数,但是没有用。

    private Component createColoring(DefaultTableModel model)
    {
    tblOrderInfo = new JTable( model )
    {
    public Component prepareRenderer(TableCellRenderer renderer, int row, int column)
    {
    Component c = super.prepareRenderer(renderer, row, column);

    //  Color row based on a cell value

    if (!isRowSelected(row))
    {
        c.setBackground(getBackground());
        int modelRow = convertRowIndexToModel(row);
        String type = (String)getModel().getValueAt(modelRow, 0);


    Object orderId="";
    Object design="";
    Object sno="";

    for(int r=0;r< tblDetailInfo.getRowCount();r++){
    orderId= tblDetailInfo.getValueAt(r,  util.getColumnIndex( tblDetailInfo, "orderId"));
    design= tblDetailInfo.getValueAt(r,  util.getColumnIndex( tblDetailInfo, "design"));
    sno= tblDetailInfo.getValueAt(r,  util.getColumnIndex( tblDetailInfo, "sno"));

    for(int o=0;o< tblOrderInfo.getRowCount();o++){
    if(( tblOrderInfo.getValueAt(o,  util.getColumnIndex( tblOrderInfo, "orderId")).equals(orderId))
    && ( tblOrderInfo.getValueAt(o,  util.getColumnIndex( tblOrderInfo, "design")).equals(design))
    && ( tblOrderInfo.getValueAt(o,  util.getColumnIndex(tblOrderInfo, "sno")).equals(sno))

    ){
    c.setForeground(Color.RED);




    }
    }


    }
    }

    return c;
    }
    };

    tblOrderInfo.setPreferredScrollableViewportSize(tblOrderInfo.getPreferredSize());
    tblOrderInfo.changeSelection(0, 0, false, false);
    tblOrderInfo.setAutoCreateRowSorter(true);
    return tblOrderInfo;
    }


调用代码如下

 DefaultTableModel dtm =(DefaultTableModel)    tblOrderInfo.getModel();
  jScrollPane2.remove(tblOrderInfo);
   jScrollPane2.add(createColoring(dtm));

最佳答案

每个单元格都会调用prepareRenderer()方法,因此您的基本代码结构错误。您循环将所有行扔到一个表中,然后将所有行扔在第二个表中。因此,如果在任何地方都找到匹配项,则该行将变为彩色,并且表中的每一行都将相同。


我想在tblDetailInfo行的基础上为tblOrderInfo行着色,


我认为您的基本伪代码应为:

foreach row in the detail table

    if ((detail.orderId.equals(order.orderid)
    and (detail.design.equals(order.design)
    and (detail.sno.equals(order.sno))
    {
        c.setForeground( Color.RED);
        break;
    }

10-06 09:06