0

我已经学会了如何在框架中显示 JTable,但我不知道如何实际更改数据。我已经阅读了大量有关该主题的教程,但似乎没有任何效果。你能回答一些关于下面代码的问题吗?

1)在actionListener中,我调用了tab.getModel().getValueAt(1,1)和tab.getValueAt(1,1)。我得到相同的数据,“小资”。如果提供相同的数据,是否需要“getModel()”?


我认为“getModel()”允许我访问我在 CustomTable.java 类中编写的任何自定义方法,但这似乎不是真的。

命令 tab.getModel().setValueAt(pane, 1, 2); 什么也没做。它甚至没有在方法中运行 System.out.println 命令。所以该方法甚至没有被调用。

2) 为什么我可以调用“getValueAt”而不是“setValueAt”?


我写了一个名为“test()”的新方法。如果我在 actionPerformed 方法中调用它,则会产生编译错误。好像方法不存在一样。

3) 那么如何在 AbstractTable Model 中调用这些自定义方法呢?

在我现在正在工作的程序中,该表由 SQL 查询的结果填充。我在 Service 类中有一个方法,它使用从查询构建的自定义对象填充下面的 ArrayList。它显示数据就好了。

我在 AbstractTableModel 类中编写了一个方法“reQuery”,它调用 Service 中的一个方法并使用来自新查询的数据重新填充 ArrayList。此方法工作正常,但我不能调用它(更不用说更新表数据)。

我在这里想念什么?


主要方法就是“new MainFrame();” MainFrame 和 CustomTable 类如下。

package scratchpad3;
import javax.swing.*;
import java.awt.event.*;
public class MainFrame extends JFrame implements ActionListener {

JPanel pane = new JPanel();
JButton butt = new JButton("Push Me To Update The Table");
JTable tab = new JTable(new CustomTable());

MainFrame(){
    setVisible(true);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(1000,200,1000,1000);
    pane.setLayout(null);
    add(pane);   
    butt.setBounds(20,10,200,100);
    butt.addActionListener(this);
    pane.add(butt);     
    tab.setBounds(20,125,500,500);
    pane.add(tab);
        tab.setValueAt(pane, 1, 2);
    }    
public void actionPerformed(ActionEvent e){
    System.out.println("With getModel() " + tab.getModel().getValueAt(1, 1) );
    System.out.println("Without getModel() " + tab.getValueAt(1, 1) );
    tab.getModel().setValueAt("Tampa", 1, 2); 
    tab.getModel().test();
    }    
}

自定义表.java

package scratchpad3;
import javax.swing.table.AbstractTableModel;
import java.util.ArrayList;

public class CustomTable extends AbstractTableModel {
    String[] colName = {"First Name", "Last Name", "City", "State"};
    ArrayList<String[]> rows = new ArrayList<String[]>();
    public String getColumnName(int col){
        return colName[col];
    }

    public int getColumnCount(){
        return colName.length;
    }

    public int getRowCount(){
        return rows.size();
    }

    public String getValueAt(int row, int col){
        System.out.println("getValueAt method was called."); //To verify the method was called
        String[] s = rows.get(row);
        return s[col];
    }

    public boolean isCellEditable(int col, int row){
        return true;
    }

    public void setValueAt(String s, int row, int col){
        System.out.println("setValueAt method was called"); //To verify the method was called
        rows.get(row)[col] = s;
        fireTableDataChanged();
    }

    public void test(){
        System.out.println("Test");
    }

    CustomTable(){
        rows.add(new String[]{"Bob", "Barker", "Glendale", "CA"});
        rows.add(new String[]{"Tom", "Petty", "Jacksonville", "FL"});
    }
}
4

1 回答 1

2

您不会覆盖该AbstractTableModel.setValueAt方法,因为您使用了不正确的签名。它应该public void setValueAt(Object s, int row, int col)代替public void setValueAt(String s, int row, int col).

于 2013-07-04T20:32:09.823 回答