Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用fireTableDataChanged()正确更新AbstractTableModel?_Java_Swing_Jtable_Listener - Fatal编程技术网

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
实现,您将永远不会关心这一点,您必须为每个from
setXxx()
方法使用哪一个
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
}