2010-08-22 14 views
2

這是我第一次在這裏發帖,很抱歉,如果我犯了一些錯誤。TableModelListener和多列驗證

我上一個JTable哪一列數據具有共同驗證的一些參數,例如:

第3倍的值> 30
第4倍的值> 10
第5倍的值> 4

另外前2列是「自動」填充的,將0放在其餘列中。

如果該數據是正確的,在第5列中,我將顯示一個刻度線的圖像,否則,我會顯示警告圖像。

爲了驗證這一點,我用下面的代碼

ImageIcon accept = new javax.swing.ImageIcon(getClass().getResource("/resources/accept.png")); 
    ImageIcon deny = new javax.swing.ImageIcon(getClass().getResource("/resources/exclamation.png")); 

    public void tableChanged(TableModelEvent e) { 
     int row = e.getFirstRow(); 
     double d1 = Double.valueOf(jTable.getValueAt(row, 2).toString()); 
     double d2 = Double.valueOf(jT.getValueAt(row, 3).toString()); 
     double d3 = Double.valueOf(jT.getValueAt(row, 4).toString()); 

     if(d1>MAX_A||d2>MAX_B||d3>MAX_C){ 
      jTable.setValueAt(deny, row, 5); 
     } 
     else{ 
      jTable.setValueAt(accept, row, 5); 
     } 
    } 

這個代碼是返回堆棧溢出的問題,我不知道該如何處理這個問題。

是否有任何其他方式來實現一個驗證表上的隱含多個單元?

在此先感謝。

+0

我想通過使用try/catch和你的註釋來解決它,因爲我也在使用空值。謝謝大家! – 2010-08-22 21:15:08

回答

3
一個好主意

這段代碼的問題是, 返回堆棧溢出,我不 知道如何處理這個問題。

問題是您的代碼在模型偵聽器中設置了一個值,因此會生成另一個tableChanged事件。你的代碼應該是這樣的:

if (e.getColumn() != 5) 
    // do your code 

我沒有看到使用TableModelListener問題動態地設置列的基礎上另一列數據的值。這裏有一個簡單的例子:

import java.awt.*; 
import javax.swing.*; 
import javax.swing.event.*; 
import javax.swing.table.*; 

public class TableProcessing extends JFrame implements TableModelListener 
{ 
    JTable table; 

    public TableProcessing() 
    { 
     super("Table"); 
     String[] columnNames = {"Item", "Quantity", "Price", "Cost"}; 
     Object[][] data = 
     { 
      {"Bread", new Integer(1), new Double(1.11), new Double(1.11)}, 
      {"Milk", new Integer(1), new Double(2.22), new Double(2.22)}, 
      {"Tea", new Integer(1), new Double(3.33), new Double(3.33)}, 
      {"Cofee", new Integer(1), new Double(4.44), new Double(4.44)} 
     }; 

     DefaultTableModel model = new DefaultTableModel(data, columnNames); 
     model.addTableModelListener(this); 
// 
     table = new JTable(model) 
     { 
      // Returning the Class of each column will allow different 
      // renderers to be used based on Class 
      public Class getColumnClass(int column) 
      { 
       return getValueAt(0, column).getClass(); 
      } 

      // The Cost is not editable 
      public boolean isCellEditable(int row, int column) 
      { 
       int modelColumn = convertColumnIndexToModel(column); 
       return (modelColumn == 3) ? false : true; 
      } 
     }; 
     table.setPreferredScrollableViewportSize(table.getPreferredSize()); 
// 
     JScrollPane scrollPane = new JScrollPane(table); 
     getContentPane().add(scrollPane); 


     String[] items = { "Bread", "Milk", "Tea", "Coffee" }; 
     JComboBox editor = new JComboBox(items); 

     DefaultCellEditor dce = new DefaultCellEditor(editor); 
     table.getColumnModel().getColumn(0).setCellEditor(dce); 
    } 

    /* 
    * The cost is recalculated whenever the quantity or price is changed 
    */ 
    public void tableChanged(TableModelEvent e) 
    { 
     if (e.getType() == TableModelEvent.UPDATE) 
     { 
      int row = e.getFirstRow(); 
      int column = e.getColumn(); 

      if (column == 1 || column == 2) 
      { 
       TableModel model = table.getModel(); 
       int quantity = ((Integer)model.getValueAt(row, 1)).intValue(); 
       double price = ((Double)model.getValueAt(row, 2)).doubleValue(); 
       Double value = new Double(quantity * price); 
       model.setValueAt(value, row, 3); 
      } 
     } 
    } 

    public static void main(String[] args) 
    { 
     TableProcessing frame = new TableProcessing(); 
     frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 
+0

不錯的例子 - 您說的很對,我真的錯過了... – 2010-08-22 16:11:22

1

您可能會因爲撥打getFirstRow而得到您的錯誤。我認爲在JTable.tableChanged中驗證表結構是個壞主意 - 你怎麼知道表已經完全填充並準備驗證?我建議首先填寫整個表格,然後再進行驗證調用。也許會有同樣使用單獨的表中顯示的驗證結果

+0

我嘗試了你的建議,雖然沒有我想要的那樣動態,但解決了問題,謝謝! – 2010-08-22 09:29:21

+0

其實,camickr下面的建議比我的更有用 - 我真的錯過了你無限次遞推事件,而getFirstRow與錯誤沒有任何關係。只要添加'if'子句,如下所述,並且您的應用將與您想要的一樣動態。 – 2010-08-22 16:09:30