2013-10-07 3 views
0

У меня есть два JTables tblOrderInfo и tblDetailInfo Я хочу покрасить строки tblOrderInfo на основе строк tblDetailInfo, я провел много исследований и нашел статью Rob Camick's и многие другие статьи, но она работает для раскраски при проверке статических значений и не работает для моего случая для динамической фильтрации JTable.Изменить цвет JTable строк

Я пробовал функцию с использованием подхода Роба, но он не работает.

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)); 

ответ

0

Следующий класс работает для меня

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)); 
    } 
1

Метод prepareRenderer() вызывается для каждой ячейки, чтобы ваш основной код структуры является неправильным. Вы зацикливаете всю строку в одной таблице, а затем все строки во второй таблице. Поэтому строка будет окрашена, если совпадение найдено где угодно, и оно будет одинаковым для каждой строки таблицы.

я хочу, чтобы цвет строки tblOrderInfo на основе строк tblDetailInfo,

Я думаю, что ваш основной псевдо-код должен быть:

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;  
    } 
+1

Спасибо @ Camickr, я признаю свою ошибку. Мой алгоритм был неправильным. Спасибо, что указал на мою ошибку. –

+0

Дорогой @Camickr снова проверен с логикой разрыва, но он не работает, и все строки таблицы заказов окрашены. –

+0

Я предложил вам внести больше изменений, чем просто добавить перерыв. Я предложил вам не нужно 2 для петель. Я не могу написать код для вас. – camickr

Смежные вопросы