当前位置: 首页 > 知识库问答 >
问题:

Java. Swing JTable.在JTable中更改数据并在Table Model中调用自定义方法

东方嘉木
2023-03-14

我已经学会了如何在帧中显示JTable,但我不知道如何实际更改数据。我已经读了很多关于这个主题的教程,但似乎没有什么是合适的。你能回答一些关于下面代码的问题吗?

1)在actionListener中,我调用tab.getModel()。getValueAt(1,1)和tab.getValueAt(1,1)。我得到相同的数据,“佩蒂”如果“getModel()”提供相同的数据,它是必要的吗?

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

“命令”选项卡。getModel()。setValueAt(窗格1、2);什么都不做。它甚至不运行系统。出来方法中的println命令。所以这个方法甚至没有被调用。

2)为什么我可以调用getValueAt,但不能调用setValueAt?

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

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

在我现在使用的程序中,该表由SQL查询的结果填充。我在服务类中有一个方法,该方法使用从查询生成的自定义对象填充下面的ArrayList。它可以很好地显示数据。

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

我错过了什么?

主要的方法就是“新建大型机();”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();
    }    
}

CustomTable.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"});
    }
}

共有1个答案

谷梁博易
2023-03-14

您不能重写AbstractTableModel.setValueAt方法,因为您使用了不正确的签名。它应该是public空setValueAt(Object s, int row, int colo)而不是public空setValueAt(String s, int row, int colo)

 类似资料:
  • 问题内容: 我正在尝试在Java GUI上实现JTable,该JTable可以使用文件中的值填充自身,并允许用户对各种单元格进行修改。由于我在Netbeans IDE中使用GUI编辑器,因此我的第一个直觉是将JTable从面板添加到表单中。但是,我很快意识到我不能在表中添加超过100行(对于我的应用程序,我需要大约500行以上)。另外,在寻找解决方案时,我注意到很多人说使用Custom Table

  • 问题内容: 你好 我已经创建了TableModel,并且想在添加新行后刷新JTable。应该向侦听器添加什么以“刷新” JTable? 这是我的“添加行”按钮的监听器: 我试图在我的actionPerformed()中使用AbstractTableModel的firetabledatachanged()方法,但运气不佳,出现了ClassCastException。 更新1 WorkPlaceGui

  • 因此,当我试图在程序中实现JTable时,我一直在阅读Java的“如何使用表”。我想要的是从数据库中获取一个字符串值列表,然后按列名和行名对它们进行排序。现在我知道没有像列那样的默认行标头,所以我通过将我的第一列设置为“行标头”来避开这个问题。因此,我决定为我的Jtable创建一个自定义表模型,以便正确地对数据进行排序(数据存储在字符串向量的向量中&列/行名分别作为字符串向量),但我遇到的只是问题

  • 我正在尝试从 JTable 刷新数据。 此方法从数据库中选择数据: 然后我使用这个方法来刷新JTable中的数据: 错误:线程“AWT-EventQueue-0”中的异常 java.lang.ClassCastException: javax.swing.JTable$1 无法强制转换为 javax.swing.table.DefaultTableModel 然后我按下一个按钮来调用这个方法。有人

  • 我正在开发一个web应用程序,使用React跟踪水果供应商的库存。js,MongoDB,Node。js和Express。我调用了数据库endpoint来呈现表中的数据。现在,我尝试使用按钮增加和减少库存量,但当我尝试设置新状态时,它不起作用。我尝试通过单击更改状态,然后更新数据库中的新状态。有什么建议吗? > 可结果成分: 从'react'导入Reac,{Component};从“react bo

  • 这个问题可能已经得到了回答,我读过很多类似的,但对我不起作用。因此,我的具有扩展的自定义表模型。我的数据是和列名。那么,当我的数据发生更改时,如何更新表呢?我一直在使用,它正在工作,但它将我的自定义单元格呈现器重置为默认值。谢了。