我已经学会了如何在帧中显示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"});
}
}
您不能重写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
这个问题可能已经得到了回答,我读过很多类似的,但对我不起作用。因此,我的具有扩展的自定义表模型。我的数据是和列名。那么,当我的数据发生更改时,如何更新表呢?我一直在使用,它正在工作,但它将我的自定义单元格呈现器重置为默认值。谢了。