Java 如何使用fireTableDataChanged()正确更新AbstractTableModel?
我正在努力处理一个应该自动更新的Java 如何使用fireTableDataChanged()正确更新AbstractTableModel?,java,swing,jtable,listener,Java,Swing,Jtable,Listener,我正在努力处理一个应该自动更新的JTable 情况如下: 我实例化MyTable(扩展JTable),并在我的UI类(MyView)中设置它。MyTable类将UI类和包含逻辑的类的实例作为参数): MyTable本身如下所示。为其设置了AbstractTableModel(MyTableModel)的扩展。将为模型设置TableModelListener的扩展。最后,将ListSelectionListener的扩展设置为模型的SelectionModel public class MyTab
JTable
情况如下:
我实例化MyTable
(扩展JTable
),并在我的UI类(MyView
)中设置它。MyTable
类将UI类和包含逻辑的类的实例作为参数):
MyTable
本身如下所示。为其设置了AbstractTableModel
(MyTableModel
)的扩展。将为模型设置TableModelListener
的扩展。最后,将ListSelectionListener
的扩展设置为模型的SelectionModel
public class MyTable extends JTable implements TableModelListener
{
public MyTable(MyView myView, MyMethods mymeth)
{
AbstractTableModel tableModel = new MyTableModel(mymeth);
setModel(tableModel);
getModel().addTableModelListener(new MyTableModelListener());
setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
setCellSelectionEnabled(true);
getColumnModel().getSelectionModel().addListSelectionListener(new MyTableSelectionListener(this, mymeth, myView));
setPreferredScrollableViewportSize(this.getPreferredSize());
}
}
让我们快速查看一下模型的构造函数
public MyTableModel(MyMethods mymeth) {
dataObject = new MyData(mymeth);
myData = dataObject.getMyData();
colTitles = dataObject.getColTitles();
}
MyData
为表格编译数据:一个Vector
,由三个Vector
s(表格数据)和一个String[]
(列标题)组成。数据本身通过逻辑类的实例mymeth
来自图形
每当单击一个表列时,就会实例化一个弹出窗口(即,JOptionPane
)对象,该对象显示所选列中第三行的值选择。用户选择一个值,并将该值设置为数据模型注意之后表格的更新方式
public MyOptionPane(int i, MyMethods mymeth, MyView myView) {
this.view = myView;
String sourceString = mymeth.getSourceString(i); // Gets a String from a
String[]. In this Array, the order is the same as in the table.
String tag = null;
tag = (String) JOptionPane.showInputDialog(this, "Choose a tag for \"" + sourceString + "\"", "String tagging" , JOptionPane.PLAIN_MESSAGE, null, myView.getTags().toArray(), myView.getTags().get(0));
mymeth.setTag(i, tag);
// This is where fireTableDataChanged() didn't work, but this did
MyTableModel model = new MyTableModel(mymeth); // New model instance
view.getMyTable().setModel(model); // reset new model to table
}
这很有效。但是,根据我所读的内容,我应该能够简单地调用模型上的fireTableDataChanged()
,并且表应该会自动更新。然而,这不起作用。用户kleopatra在之前的帖子中回答:
不要从模型外部的任何代码调用模型的任何fireXX方法。
而是实现模型,以便在发生任何更改时执行此操作
因此:我是否可以在这样的结构中调用fireTableDataChanged()
提前感谢所有的启示 不回答您的问题,建议使用
DefaultTableModel
如果您不需要为JTable
限制某些内容,这是一个很好的理由,那么您不能使用,最好的工作仍然是,如果您使用DefaultTableModel
实现,您将永远不会关心这一点,您必须为每个fromsetXxx()
方法使用哪一个firexxxxxchanged()
从我所读到的内容来看,我应该能够简单地在模型上调用fireTableDataChanged(),并且表应该会自我更新
您的程序不会调用模型上的fireXXX方法。TableModel本身负责在模型中的任何数据发生更改时调用这些方法。请看Swing教程中的示例。setValueAt(…)方法显示了如何调用适当的fireXXX方法
如果创建一个全新的TableModel,则需要使用setModel()方法
Kleopatra的评论是所有fireXXX方法都可以从TableModel类本身调用。如果您想了解这是如何实现的,那么请查看DefaultTableModel的源代码。If有一个示例,说明您何时将调用fireTableDataChanged()方法以及其他fireXXX方法。您不必替换整个模型来更新一行。相反,更新受影响的单元格并让setValueAt()
触发所需事件,如图所示。或者,此相关函数使用一个DefaultTableModel
来为您处理事件,正如@mKorbel&@camickr所建议的那样
如果您继续使用,请考虑<代码>列表>代码>,除非您需要代码>向量\代码>其他原因。
< P>这里有一个简单的程序,该代码具有<代码> ARAYLIST/<代码> <代码>人>代码>,用“<代码> ARLayList</代码>中的数据填充表,并更新代码< > ActucTababMuldE/<代码> <代码> FieldTabDeaDangEdEd()/<代码>。希望这有帮助import java.util.ArrayList;
导入javax.swing.table.AbstractTableModel;
/**
*
*@作者拉扎克
*/
公共类表扩展了javax.swing.JFrame{
ArrayList记录;//人员的ArrayList
AbstractTableModel;//表模型——内部类
/**
*创建新的表单表
*/
公共表(){
记录=新的ArrayList();
tableModel=新的抽象表(记录);
addData();
初始化组件();
setModel(tableModel);
}
/**
*将测试值添加到表中
*/
私有void addData(){
记录。添加(新人员(“测试人员”,21));
增加(新的人(“科菲”,20));
增加(新的人(“Razak”,251));
添加(新的人(“Joseph”,21));
}
/**
*从构造函数中调用此方法来初始化表单。
*警告:不要修改此代码。此方法的内容始终为
*由表单编辑器重新生成。
*/
@抑制警告(“未选中”)
//
私有组件(){
jScrollPane1=newjavax.swing.JScrollPane();
recordTable=newjavax.swing.JTable();
namelab=newjavax.swing.JLabel();
ageLabel=newjavax.swing.JLabel();
nameTextField=newjavax.swing.JTextField();
ageTextField=newjavax.swing.JTextField();
addButton=newjavax.swing.JButton();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setModel(tableModel);
jScrollPane1.setViewportView(可记录);
nameLabel.setText(“名称”);
ageLabel.setText(“年龄”);
addButton.setText(“添加”);
addButton.addActionListener(新java.awt.event.ActionListener(){
public void actionPerformed(java.awt.event.ActionEvent evt){
addButtonActionPerformed(evt);
}
});
javax.swing.GroupLayout=newjavax.swing.GroupLayout(getContentPane());
public MyOptionPane(int i, MyMethods mymeth, MyView myView) {
this.view = myView;
String sourceString = mymeth.getSourceString(i); // Gets a String from a
String[]. In this Array, the order is the same as in the table.
String tag = null;
tag = (String) JOptionPane.showInputDialog(this, "Choose a tag for \"" + sourceString + "\"", "String tagging" , JOptionPane.PLAIN_MESSAGE, null, myView.getTags().toArray(), myView.getTags().get(0));
mymeth.setTag(i, tag);
// This is where fireTableDataChanged() didn't work, but this did
MyTableModel model = new MyTableModel(mymeth); // New model instance
view.getMyTable().setModel(model); // reset new model to table
}