我已经学会了如何在框架中显示 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"});
}
}