2012-03-16 2 views
3

У меня есть jtable. (Tablesummary). один из его столбцов - EXPIRY. Я хочу выделить строку с клиентом, срок годности которого уже истек в текущую дату.Как установить цвет для определенной строки, если определенные условия выполняются с помощью java?

У меня уже есть логика, но я не могу сделать строку красной или любых других цветов. вот мой код:

  int count = (tableSummary.getRowCount()); 
     NumberFormat formatter = new DecimalFormat("###,###");   
     String no = formatter.format(count); 
     txtNo.setText(no); 

      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");  
      Calendar cal = Calendar.getInstance();   
      String expDateString = sdf.format(cal.getTime()).toString(); 

      for(int i=0; i<=tableSummary.getRowCount()-1; i++){ 
       String nnn= tableSummary.getModel().getValueAt(i, 6).toString(); 
       System.out.println(nnn); 
       int res = nnn.compareTo(expDateString); 
        if(res>=0){ 
         System.out.println("if ni " + (res>=0)); 
        } 
        else{ 
         System.out.println("else ni" + (res>=0)); 
         rowrenderer.setBackground(Color.RED); 


        }       
      } 

может кто-нибудь помочь мне с этим? потому что это один из основных моментов моего интерфейса. Спасибо заранее! :)

+0

показать определение "rowrenderer". – Juvanis

+0

вы забыли добавить код для вашего cellrenderer – Peter

+0

Возможный дубликат [Как выделить таблицу строк при условии состояния?] (Http://stackoverflow.com/questions/9714110/how-to-highlight-row-table-if -given-a-condition) – kleopatra

ответ

3

В следующей ссылке вы можете найти пример действия, которое вы хотите сделать: http://www.roseindia.net/java/example/java/swing/SadingRows.shtml

Вы должны переопределить prepareRenderer() на JTable и добавьте BackgroundColor на Component, который получает вернулся.

PS: для дальнейшего использования было бы проще, если бы вы включили больше кода. Определение ваших rowrenderer =)

EDIT

вместо обычного JTable table = new JTable(model) декларации, используйте следующее (изменить логику в методе prepareRenderer, если вы хотите что-то другое, чем переменного цвета):

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

У меня еще нет определения для rowrenderer. Я просто показывал это по той причине, что у меня есть немного идеи, что я должен использовать это, но на самом деле не знаю, как его кодировать. – zairahCS

+0

добавил код, который имеет значение в ответе – Molske

8

... описано в предыдущих потоков и ответов, только пример

enter image description here

из кода

import java.awt.*; 
import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.Calendar; 
import java.util.Date; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.swing.*; 
import javax.swing.border.LineBorder; 
import javax.swing.table.*; 

public class TablePrepareRenderer extends JFrame { 

    private static final long serialVersionUID = 1L; 
    private JTable table; 
    private Date maturityDate = new Date(); 
    private Date todayDate = new Date(); 
    private SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy"); 
    private Date tableDate = new Date(); 
    private String strDate = ""; 
    private Date modifDate = new Date(); 
    private Calendar cal; 

    public TablePrepareRenderer() { 
     Object[] columnNames = {"Type", "Company", "Shares", "Price", "Date"}; 
     Object[][] data = { 
      {"Buy", "IBM", new Integer(1000), new Double(80.50), new Date()}, 
      {"Sell", "MicroSoft", new Integer(2000), new Double(6.25), new Date()}, 
      {"Sell", "Apple", new Integer(3000), new Double(7.35), new Date()}, 
      {"Buy", "Nortel", new Integer(4000), new Double(20.00), new Date()} 
     }; 
     DefaultTableModel model = new DefaultTableModel(data, columnNames) { 

      private static final long serialVersionUID = 1L; 

      @Override 
      public Class getColumnClass(int column) { 
       return getValueAt(0, column).getClass(); 
      } 
     }; 
     table = new JTable(model) { 

      private static final long serialVersionUID = 1L; 

      @Override 
      public Component prepareRenderer(TableCellRenderer renderer, int row, int column) { 
       Component c = super.prepareRenderer(renderer, row, column); 
       /*int firstRow = 0; 
       int lastRow = table.getRowCount() - 1; 
       if (row == lastRow) { 
       ((JComponent) c).setBackground(Color.red); 
       } else if (row == firstRow) { 
       ((JComponent) c).setBackground(Color.blue); 
       } else { 
       ((JComponent) c).setBackground(table.getBackground()); 
       }*/ 
       if (!isRowSelected(row)) { 
        if (table.getColumnCount() >= 0) { 
         String type = (String) getModel().getValueAt(row, 0); 
         c.setBackground("Buy".equals(type) ? Color.YELLOW : Color.GREEN); 
// 
         maturityDate = new Date(); 
         todayDate = new Date(); 
         strDate = sdf.format(todayDate); 
         try { 
          todayDate = sdf.parse(strDate); 
         } catch (ParseException ex) { 
          Logger.getLogger(TablePrepareRenderer.class.getName()).log(Level.SEVERE, null, ex); 
         } 
         tableDate = (Date) table.getValueAt(row, 4); 
         strDate = sdf.format(tableDate); 
         if (strDate != null) { 
          if (!strDate.isEmpty()) { 
           try { 
            maturityDate = sdf.parse(strDate); 
           } catch (ParseException ex) { 
            Logger.getLogger(TablePrepareRenderer.class.getName()).log(Level.SEVERE, null, ex); 
           } 
           if (maturityDate != null) { 
            int mmDiffDealToValue = (maturityDate).compareTo(todayDate); 
            if (((mmDiffDealToValue < 0))) { 
             c.setBackground(Color.orange); 
             c.setFont(new Font("Serif", Font.BOLD, 12)); 
            } 
           } 
          } 
         } 
// 
        } 
       } 
       if (isRowSelected(row) && isColumnSelected(column)) { 
        ((JComponent) c).setBorder(new LineBorder(Color.red)); 
       } 
       return c; 
      } 
     }; 
     modifyDateInTable(); 
     table.setPreferredScrollableViewportSize(table.getPreferredSize()); 
     JScrollPane scrollPane = new JScrollPane(table); 
     getContentPane().add(scrollPane); 
    } 

    private void modifyDateInTable() { 
     Calendar c = Calendar.getInstance(); 
     c.setTime(modifDate); 
     c.add(Calendar.DATE, - 1); 
     modifDate = c.getTime(); 
     table.setValueAt(modifDate, 0, 4); 
     c.setTime(modifDate); 
     c.add(Calendar.DATE, +5); 
     modifDate = c.getTime(); 
     table.setValueAt(modifDate, 1, 4); 
     c.setTime(modifDate); 
     c.add(Calendar.DATE, +1); 
     modifDate = c.getTime(); 
     table.setValueAt(modifDate, 1, 4); 
     c.setTime(modifDate); 
     c.add(Calendar.DATE, - 16); 
     modifDate = c.getTime(); 
     table.setValueAt(modifDate, 3, 4); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       TablePrepareRenderer frame = new TablePrepareRenderer(); 
       frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
       frame.pack(); 
       frame.setLocation(150, 150); 
       frame.setVisible(true); 
      } 
     }); 
    } 
} 
+1

+1, 'Renderer' всегда так смущая меня, хотя, без сомнения, с ними можно сделать удивительные штучки. Узнал что-то новое, с этим :-) –

0

enter image description here

общественного класса TablePrepareRenderer расширяет JFrame {

private JTable table; 

public TablePrepareRenderer() { 
    Object[] columnNames = { "Type", "Company", "Name", "Salery", "Designation" }; 
    Object[][] data = 
    { { "Probation", "Digital Research Lab", "Kamran Ali", "500,000", "Java Developer" }, { "Permenent", "Netsole", 
                          "Farhan Khan", 
                          "80,000", 
                          "System Administaror" }, 
     { "Contract", "System Limited", "Danyal", "100,000", "Network Administrator" }, 
     { "Probation", "TeraData", "Ali Raza", "45,000", "IT Officer" }, 
     { "Contract", "MicroSoft", "Sikandar Hayat", "450,000", "Team Lead" }, 
     { "Permenent", "MicroSoft", "Adnan", "30,000", "Driver" }, }; 
    DefaultTableModel model = new DefaultTableModel(data, columnNames) { 


     @Override 
     public Class getColumnClass(int column) { 
      return getValueAt(0, column).getClass(); 
     } 
    }; 
    table = new JTable(model) { 
      @Override 
      public Component prepareRenderer(TableCellRenderer renderer, int row, int column) { 
       Component c = super.prepareRenderer(renderer, row, column); 

       if (!isRowSelected(row)) { 
        if (table.getColumnCount() >= 0) { 
         String type = (String)getModel().getValueAt(row, 0); 
         if (type.equalsIgnoreCase("Probation")) { 
          c.setBackground(new Color(198, 190, 255)); 

         } 
         if (type.equalsIgnoreCase("Permenent")) { 
          c.setBackground(new Color(14, 255, 190)); 

         } 
         if (type.equalsIgnoreCase("Contract")) { 
          c.setBackground(Color.green); 

         } 

        } 
       } 
       if (isRowSelected(row) && isColumnSelected(column)) { 
        ((JComponent)c).setBorder(new LineBorder(Color.red)); 
       } 
       return c; 
      } 
     }; 

    table.setPreferredScrollableViewportSize(table.getPreferredSize()); 
    JScrollPane scrollPane = new JScrollPane(table); 
    getContentPane().add(scrollPane); 
} 


public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable() { 

     @Override 
     public void run() { 
      TablePrepareRenderer frame = new TablePrepareRenderer(); 
      frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
      frame.pack(); 
      frame.setLocation(150, 150); 
      frame.setSize(800, 500); 
      frame.setVisible(true); 


     } 
    }); 
} 

}

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