Java 更改JTable行的颜色

Java 更改JTable行的颜色,java,swing,jtable,tablecellrenderer,Java,Swing,Jtable,Tablecellrenderer,我有两个JTable tblOrderInfo和tblDetailInfo我想在tblDetailInfo行的基础上给tblOrderInfo行上色,我做了很多研究,找到了文章和许多其他文章,但它适用于基于静态值检查的着色,不适用于我对JTable的动态过滤 我用Rob的方法尝试了一个函数,但它不起作用 private Component createColoring(DefaultTableModel model) { tblOrderInfo = new JTable

我有两个JTable tblOrderInfo和tblDetailInfo我想在tblDetailInfo行的基础上给tblOrderInfo行上色,我做了很多研究,找到了文章和许多其他文章,但它适用于基于静态值检查的着色,不适用于我对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;
    }
每个单元格都会调用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;    
    }

下面的课程适合我

  class MyTableCellRenderer extends DefaultTableCellRenderer implements TableCellRenderer {
 AssignOrderToWax ass =null;

 public MyTableCellRenderer( AssignOrderToWax ass){
     this.ass=ass;
 }
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        setForeground(Color.BLACK);
        super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);


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

if((ass.tblOrderInfo.getValueAt(row, ass.util.getColumnIndex(ass.tblOrderInfo, "orderId")).equals(orderId))
     && (ass.tblOrderInfo.getValueAt(row, ass.util.getColumnIndex(ass.tblOrderInfo, "design")).equals(design))
     && (ass.tblOrderInfo.getValueAt(row, ass.util.getColumnIndex(ass.tblOrderInfo, "sno")).equals(sno))

        ){ 
            setForeground(Color.RED);
            break ;

            }

    }return this;
    }

}
类MyTableCellRenderer扩展了DefaultTableCellRenderer实现了TableCellRenderer{ AssignOrderToWax ass=null; 公共MyTableCellRenderer(AssignOrderToWax ass){ 这个。ass=ass; } @凌驾 公共组件GetTableCellRenderComponent(JTable表、对象值、布尔isSelected、布尔hasFocus、int行、int列){ 设置前景(颜色为黑色); getTableCellRenderComponent(表、值、isSelected、hasFocus、行、列); 对象orderId=“”; 对象设计=”; 对象sno=“”;
对于(int r=0;rTanks@Camickr我承认我的错误。我的算法是错误的,中断丢失了。谢谢你指出我的错误。亲爱的@Camickr再次使用中断逻辑进行了测试,但它不起作用,订单表的所有行都是彩色的。我建议你需要做更多的更改,而不仅仅是添加中断。我建议你不需要2个for循环。我无法编写为您编写代码。您的逻辑在某个地方出错。除非您能发布正确的
SSCCE
,否则我无法再提出建议,因为我不知道您是否正确实施了我的建议,或者我是否理解您的确切要求。
  class MyTableCellRenderer extends DefaultTableCellRenderer implements TableCellRenderer {
 AssignOrderToWax ass =null;

 public MyTableCellRenderer( AssignOrderToWax ass){
     this.ass=ass;
 }
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        setForeground(Color.BLACK);
        super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);


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

if((ass.tblOrderInfo.getValueAt(row, ass.util.getColumnIndex(ass.tblOrderInfo, "orderId")).equals(orderId))
     && (ass.tblOrderInfo.getValueAt(row, ass.util.getColumnIndex(ass.tblOrderInfo, "design")).equals(design))
     && (ass.tblOrderInfo.getValueAt(row, ass.util.getColumnIndex(ass.tblOrderInfo, "sno")).equals(sno))

        ){ 
            setForeground(Color.RED);
            break ;

            }

    }return this;
    }

}
      Enumeration<TableColumn> en = tblOrderInfo.getColumnModel().getColumns();
    while (en.hasMoreElements()) {
       tc = en.nextElement();
        tc.setCellRenderer(new MyTableCellRenderer(this));
    }