2014-12-10 63 views
0

我知道這個問題上有很多問題,但由於某種原因,我無法找到解決這個問題的方法。遇到preperedRenderer問題JTable

如果兩列沒有相同的值,我需要更改行顏色。

看到此鏈接:http://tips4java.wordpress.com/2010/01/24/table-row-rendering/

,但不能使它工作....

嘗試,這也:

public void colorRow(JTable table){ 
     for(int column=0;column<table.getRowCount();column++){ 
     for(int row=0;row<table.getRowCount();row++){ 
      TableCellRenderer renderer = table.getCellRenderer(row, column); 
      Component comp = table.prepareRenderer(renderer, row, column); 
      Float sinh = (Float)table.getModel().getValueAt(row,6); 
      Float kol = (Float)table.getModel().getValueAt(row, 5); 
      if(!kol.equals(sinh)){ 
       comp.setBackground(Color.YELLOW); 
      } 
     } 
     } 
    } 

但它描繪表中的所有行是否有是列5​​和列6不具有相同值的行。

希望得到任何幫助

更新(SSCCE):

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Component; 
import java.awt.EventQueue; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.border.EmptyBorder; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.table.TableCellRenderer; 

import java.awt.GridBagLayout; 
import java.awt.GridLayout; 

import javax.swing.JScrollPane; 
import javax.swing.JTable; 

public class table extends JFrame { 

    private JPanel contentPane; 
    private JTable table; 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        table frame = new table(); 
        frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 


    public table() { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setBounds(100, 100, 495, 317); 
     contentPane = new JPanel(); 
     contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
     setContentPane(contentPane); 
     contentPane.setLayout(new GridLayout(1, 0, 0, 0)); 

     DefaultTableModel model = new DefaultTableModel(); 

     model.addColumn("ID"); 
     model.addColumn("Value 1"); 
     model.addColumn("Value 2"); 

     int id1=1; 
     int id2=2; 
     int id3=3; 
     Float one1=3.0f; 
     Float two1=4.0f; 
     Float one2=2.0f; 
     Float two2=2.0f; 
     Float one3=1.0f; 
     Float two3=2.0f; 

     model.insertRow(0, new Object [] {id1, one1,two1}); 
     model.insertRow(0, new Object [] {id2, one2,two2}); 
     model.insertRow(0, new Object [] {id3, one3,two3}); 

     JScrollPane scrollPane = new JScrollPane(); 
     contentPane.add(scrollPane); 

     table = new JTable(model); 
     scrollPane.setViewportView(table); 
     colorRow(table); 

    } 
    public void colorRow(JTable table){ 
     for(int column=0;column<table.getColumnCount();column++){ 
     for(int row=0;row<table.getRowCount();row++){ 
      TableCellRenderer renderer = table.getCellRenderer(row, column); 
      Component comp = table.prepareRenderer(renderer, row, column); 
      comp.setBackground(getBackground()); 
      Float sinh = (Float)table.getModel().getValueAt(row,2); 
      Float kol = (Float)table.getModel().getValueAt(row, 1); 
      if(!kol.equals(sinh)){ 
       comp.setBackground(Color.YELLOW); 
      } 
     } 
     } 
    } 

} 
+1

'但不能使它工作.... - - 那麼,發佈[SSCCE](http://sscce.org/),這表明問題,因爲我們不介意讀者,不能猜測你的代碼是什麼。您發佈的代碼將不起作用,因爲一旦您更改了渲染器的背景,它將成爲默認顏色。請注意,在給出的鏈接代碼中,如何在重新設置行顏色之前重置背景。 – camickr 2014-12-10 23:17:39

+0

爲什麼人們堅持重寫'prepareRenderer'方法?爲什麼不只是定義一個適當的單元格渲染器(s),它可以更容易地插入到現有的代碼:P – MadProgrammer 2014-12-10 23:33:19

+0

@camickr更新了一個例子..hope這有助於找出我的問題。感謝 – caniaskyouaquestion 2014-12-11 07:41:05

回答

1

我只是試圖從this post你SSCCE的解決方案,它的工作原理。所以刪除colorRow()方法,然後在你的構造與此替換表初始化table = new JTable(model);

table = new JTable(model) { 
     @Override 
     public Component prepareRenderer(TableCellRenderer renderer, int row, int column) { 
      Component comp = super.prepareRenderer(renderer, row, column); 
      int modelRow = convertRowIndexToModel(row); 
      Float sinh = (Float) getModel().getValueAt(modelRow, 2); 
      Float kol = (Float) getModel().getValueAt(modelRow, 1); 
      comp.setBackground(kol.equals(sinh) ? getBackground() : Color.YELLOW); 
      return comp; 
     } 
    }; 

你定我原來的代碼示例中指出的問題:通過使用列計數for(int column=0; column < table.getRowCount(); column++){,但這並沒有解決你的帖子的原因。

+0

沒有幫助....這是一個錯誤,但仍繪畫所有行:( – caniaskyouaquestion 2014-12-11 07:41:53