2013-04-17 124 views
1

我試圖在用戶編輯並輸入新值時更新JTable,但我收到了投射錯誤。在運行時更新Jtable?

編碼到目前爲止:

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

public class Stackq extends AbstractTableModel { 
    Vector data; 
    Vector columns; 

    public Stackq() { 
    String line; 
    data = new Vector(); 
columns = new Vector(); 
    int count = 0; 


    try { 
FileInputStream fis = new FileInputStream("D:/joy/text/registration.txt"); 
BufferedReader br = new BufferedReader(new InputStreamReader(fis)); 
StringTokenizer st1 = new StringTokenizer(br.readLine(), "\t"); 
while (st1.hasMoreTokens()) { 
columns.addElement(st1.nextToken()); 
count++; 
} 
while ((line = br.readLine()) != null) { 
StringTokenizer st2 = new StringTokenizer(line, "\t"); 
for (int i = 0; i < count; i++) { 
    if (st2.hasMoreTokens()) 
    data.addElement(st2.nextToken()); 
    else 
    data.addElement(""); 
} 
} 
br.close(); 
} catch (Exception e) { 
e.printStackTrace(); 
    } 
    } 



    public void setValueAt(Object value, int row, int col){ 
((Vector) data.get(row)).setElementAt(value, col); 
fireTableCellUpdated(row,col); 
} 

public boolean isCellEditable(int row, int col){ 
//if (4 == col){ 
return true; 
} 
//else { 
// return false; 
// } 
//} 

public void insertData(Object[] values){ 
data.add(new Vector()); 
for(int i =0; i<values.length; i++){ 
((Vector) data.get(data.size()-1)).add(values[i]); 
     } 
fireTableDataChanged(); 
} 

public void removeRow(int row){ 
data.removeElementAt(row); 
fireTableDataChanged(); 
} 


    public int getRowCount() { 
      return data.size()/getColumnCount(); 
    } 

    public int getColumnCount() { 
      return columns.size(); 
    } 

    public Object getValueAt(int rowIndex, int columnIndex) { 
      return (String) data.elementAt((rowIndex * getColumnCount()) 
          + columnIndex); 
    } 

     public String getColumnName(int i){ 
     return (String)columns.get(i); 
     } 


    public static void main(String s[]) { 
      Stackq model = new Stackq(); 
      JTable table = new JTable(); 
      table.setModel(model); 



      JScrollPane scrollpane = new JScrollPane(table); 
      JPanel panel = new JPanel(); 
      panel.add(scrollpane); 
      JFrame frame = new JFrame(); 
      frame.add(panel, "Center"); 
      frame.pack(); 
      frame.setVisible(true); 


    } 
    } 

錯誤消息:

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.lang.String cannot be cast to java.util.Vector 
     at Stackq.setValueAt(Stackq.java:45) 
     at javax.swing.JTable.setValueAt(JTable.java:2709) 
     at javax.swing.JTable.editingStopped(JTable.java:4711) 
     at javax.swing.AbstractCellEditor.fireEditingStopped(AbstractCellEditor.java:125) 
     at javax.swing.DefaultCellEditor$EditorDelegate.stopCellEditing(DefaultCellEditor.java:350) 
     at javax.swing.DefaultCellEditor.stopCellEditing(DefaultCellEditor.java:215) 
     at javax.swing.JTable$GenericEditor.stopCellEditing(JTable.java:5465) 
     at javax.swing.plaf.basic.BasicTableUI$Handler.mousePressed(BasicTableUI.java:980) 
     at java.awt.AWTEventMulticaster.mousePressed(AWTEventMulticaster.java:263) 
     at java.awt.Component.processMouseEvent(Component.java:6260) 
     at javax.swing.JComponent.processMouseEvent(JComponent.java:3267) 
+1

相同的答案,閱讀Oracle教程,Model_To_View有很好的描述 – mKorbel

回答

0

這很容易解釋,一方面是你與你的個人檔案填寫的字符串數據載體。稍後在setValueAt中,將向量的值視爲另一個向量(因爲您將字符串放在那裏,所以它們不是)。

我建議你正確定義你的矢量(取決於你實際需要在那裏)。我猜你想要麼這個

Vector<String> data 

Vector<Vector<String>> data 
1

data實例是Vector。在這條線上,

((Vector) data.get(row)).setElementAt(value, col); 

您獲取從的載體,而你的情況是字符串中的一個元素。現在你試圖將該字符串轉換爲Vector(Vector),這顯然不起作用。

你想安全的向量載體產生一個表?也許定義通用向量的類型可以幫助你找到你的問題,例如Vector<Vector<String>> data

0

您應該看到警告 「Vector是原始類型......」

第一件事:

Vector data; 

應該

Vector<String> data; 

總是看的警告,他們在那裏因爲某種原因。

第二件事:

數據的類型爲矢量持有弦了。你將數據的內容(這是一個字符串)轉換爲Vector,這顯然不起作用。

((Vector) data.get(row)).setElementAt(value, col); 

應該

data.setElementAt(value, col); 

形成你的代碼,我會認爲這是錯誤的或者,因爲它看起來像你想有一個矩陣晶格結構。所以你必須聲明一個持有類型爲string的向量的向量。

Vector<Vector<String>>data = null; 

那麼你可以像這樣訪問:

Vector<String>row = data.get(row); 
String value = row.get(column); 

並試圖擺脫鑄件。轉換通常表明設計中可能存在某些問題,並阻止解析器在編譯時捕獲錯誤。