【问题标题】:Update the Jtable at Runtime?在运行时更新 Jtable?
【发布时间】:2013-04-17 09:19:45
【问题描述】:

当用户编辑并在其中输入新值时,我正在尝试更新 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)

【问题讨论】:

  • 同样的答案,阅读 Oracle 教程,Model_To_View with good description

标签: java swing jtable add


【解决方案1】:

您的data 实例是Vector。在这条线上,

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

您使用data.get(row) 从向量中获取单个元素,在您的情况下是一个字符串。现在您正尝试使用(Vector) 将该字符串转换为Vector,这显然不起作用。

你想安全向量中的向量来生成表格吗?也许定义通用向量的类型将帮助您找到问题,例如Vector&lt;Vector&lt;String&gt;&gt; data

【讨论】:

    【解决方案2】:

    这很容易解释,一方面,您使用文件中的单个字符串填充数据向量。稍后在 setValueAt 中,您将向量的值视为另一个向量(因为您将字符串放入其中,所以它们不是)。

    我建议您正确定义您的 Vector(取决于您实际想要的内容)。我猜你想要这个

    Vector<String> data
    

    Vector<Vector<String>> data
    

    【讨论】:

      【解决方案3】:

      您应该会看到警告“Vector is a raw type...”

      第一件事:

      Vector data;
      

      应该是

      Vector<String> data;
      

      始终查看警告,它们的存在是有原因的。

      第二件事:

      Data 已经是持有 Strings 的 Vector 类型。你把数据的内容(一个字符串)转换成Vector,这显然是行不通的。

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

      应该是

      data.setElementAt(value, col);
      

      形成你的代码我会认为这也是错误的,因为看起来你想要一个矩阵结构。所以你必须声明一个包含字符串类型向量的向量。

      Vector<Vector<String>>data = null;
      

      那么你可以像这样访问它:

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

      并尝试摆脱演员表。强制转换通常表明您的设计可能存在问题,并阻止解析器在编译时捕获错误。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-30
        • 2013-01-03
        • 2013-03-11
        • 2011-01-31
        • 2019-05-29
        • 1970-01-01
        相关资源
        最近更新 更多