Java 单击按钮时,如何刷新扩展AbstractTableModel以替换值的自定义jtable模型?
如何刷新JTable,以便在单击按钮时显示我将传入的新值 以下是我的自定义JTable模式:Java 单击按钮时,如何刷新扩展AbstractTableModel以替换值的自定义jtable模型?,java,swing,user-interface,jtable,Java,Swing,User Interface,Jtable,如何刷新JTable,以便在单击按钮时显示我将传入的新值 以下是我的自定义JTable模式: static class MyModel extends AbstractTableModel { private final String[] columnNames = {"Last Name", "First Name", "Email Address", "Address", "Age",
static class MyModel extends AbstractTableModel {
private final String[] columnNames = {"Last Name", "First Name", "Email Address", "Address", "Age",
"Residence Type", "District Number", "Gender"};
private ArrayList<String[]> Data = new ArrayList<>();
public void AddCSVData(ArrayList<String[]> DataIn) {
ArrayList<String[]> stringList = DataIn;
this.Data = stringList;
this.fireTableDataChanged();
}
@Override
public int getColumnCount() {
return columnNames.length;// length;
}
@Override
public int getRowCount() {
return Data.size();
}
@Override
public String getColumnName(int col) {
return columnNames[col];
}
@Override
public Object getValueAt(int row, int col) {
return Data.get(row)[col];
}
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
public boolean isCellEditable(int row, int col) {
return false;
}
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
String[][] cells = null;
cells[rowIndex][columnIndex] = (String) aValue;
fireTableCellUpdated(rowIndex, columnIndex);
}
}
静态类MyModel扩展了AbstractTableModel{
私有最终字符串[]columnNames={“姓”、“名”、“电子邮件地址”、“地址”、“年龄”,
“居住类型”、“地区编号”、“性别”};
private ArrayList Data=new ArrayList();
public void AddCSVData(ArrayList DataIn){
ArrayList stringList=DataIn;
this.Data=stringList;
this.fireTableDataChanged();
}
@凌驾
public int getColumnCount(){
返回columnNames.length;//长度;
}
@凌驾
public int getRowCount(){
返回Data.size();
}
@凌驾
公共字符串getColumnName(int-col){
返回列名[col];
}
@凌驾
公共对象getValueAt(整数行,整数列){
返回数据。获取(行)[col];
}
公共类getColumnClass(int c){
返回getValueAt(0,c).getClass();
}
公共布尔值可编辑(int行,int列){
返回false;
}
@凌驾
public void setValueAt(对象有效、int行索引、int列索引){
字符串[][]单元格=null;
单元格[rowIndex][columnIndex]=(字符串)aValue;
fireTableCellUpdated(行索引、列索引);
}
}
这里有一个按钮,单击该按钮时,jtable中的值应该被更新:
ascendingButton = new JButton("Ascending");
ascendingButton.setBounds(60, 120, 120, 30);
sidePane.add(ascendingButton);
ascendingButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
MyProgramUtility hehe = new MyProgramUtility();
String path = "src\\res\\data.csv";
try {
ArrayList<Citizen> array = MyProgramUtility.printNameAscending(MyProgramUtility.readCSV(path), path);
List<String> strings = array.stream()
.map(object -> Objects.toString(object, null))
.collect(Collectors.toList());
ArrayList<String[]> array1 = new ArrayList<>();
for (String g : strings) {
OneRow = g.split(",(?=([^\\\"]*\\\"[^\\\"]*\\\")*[^\\\"]*$)");
Rs.add(OneRow);
}
spreadSheet = new JTable(new MyModel());
spreadSheet.setModel(NewModel);
ArrayList<String[]> Rs2 = Rs;
NewModel.AddCSVData(Rs2);
System.out.println("Rows: " + NewModel.getRowCount());
System.out.println("Cols: " + NewModel.getColumnCount());
} catch (FileNotFoundException fileNotFoundException) {
fileNotFoundException.printStackTrace();
}
}
});
descendingButton = new JButton("Descending");
descendingButton.setBounds(200, 120, 120, 30);
sidePane.add(descendingButton);
descendingButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String path = "src\\res\\data.csv";
try {
ArrayList<Citizen> array = MyProgramUtility.printNameDescending(MyProgramUtility.readCSV(path), path);
List<String> strings = array.stream()
.map(object -> Objects.toString(object, null))
.collect(Collectors.toList());
ArrayList<String[]> array1 = new ArrayList<>();
for (String g : strings) {
OneRow = g.split(",(?=([^\\\"]*\\\"[^\\\"]*\\\")*[^\\\"]*$)");
Rs.add(OneRow);
}
ArrayList<String[]> Rs2 = Rs;
NewModel.AddCSVData(Rs2);
System.out.println("Rows: " + NewModel.getRowCount());
System.out.println("Cols: " + NewModel.getColumnCount());
} catch (FileNotFoundException fileNotFoundException) {
fileNotFoundException.printStackTrace();
}
}
});
ascendingButton=newjbutton(“升序”);
上升按钮。后退(60、120、120、30);
侧窗格。添加(上升按钮);
ascendingButton.addActionListener(新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
MyProgramUtility hehe=新的MyProgramUtility();
String path=“src\\res\\data.csv”;
试一试{
ArrayList数组=MyProgramUtility.printNameAscending(MyProgramUtility.readCSV(路径),路径);
List strings=array.stream()
.map(对象->对象.toString(对象,空))
.collect(Collectors.toList());
ArrayList array1=新的ArrayList();
for(字符串g:字符串){
OneRow=g.split(“,(?=([^\\\”]*\\\“[^\\\”]*\\”*[^\\”]*$)”;
Rs.add(OneRow);
}
电子表格=新的JTable(新的MyModel());
电子表格.setModel(NewModel);
ArrayList Rs2=Rs;
NewModel.AddCSVData(Rs2);
System.out.println(“行:+NewModel.getRowCount());
System.out.println(“Cols:+NewModel.getColumnCount());
}捕获(FileNotFoundException FileNotFoundException){
fileNotFoundException.printStackTrace();
}
}
});
下降按钮=新按钮(“下降”);
下降按钮。立根(200、120、120、30);
侧窗格。添加(下降按钮);
addActionListener(新ActionListener()){
@凌驾
已执行的公共无效操作(操作事件e){
String path=“src\\res\\data.csv”;
试一试{
ArrayList数组=MyProgramUtility.printNameDescending(MyProgramUtility.readCSV(路径),路径);
List strings=array.stream()
.map(对象->对象.toString(对象,空))
.collect(Collectors.toList());
ArrayList array1=新的ArrayList();
for(字符串g:字符串){
OneRow=g.split(“,(?=([^\\\”]*\\\“[^\\\”]*\\”*[^\\”]*$)”;
Rs.add(OneRow);
}
ArrayList Rs2=Rs;
NewModel.AddCSVData(Rs2);
System.out.println(“行:+NewModel.getRowCount());
System.out.println(“Cols:+NewModel.getColumnCount());
}捕获(FileNotFoundException FileNotFoundException){
fileNotFoundException.printStackTrace();
}
}
});
下面是GUI设计的图片
我尝试了上面的代码,它只打印出终端中的值。它没有像我计划的那样更新JTable。非常感谢你的帮助
什么是新型号?如果是显示的JTable的模型,则视图会在调用fireTableDataChanged()后立即更新,创建新的JTable和新的TableModel是无用的。@Rocco我已经删除了该行,但它仍然不会更新该表。您没有回答,我将澄清我的问题:什么是新模型?在哪里申报?怎么用的?使用JTable的正确方法是:1。创建表格模型,2。使用tablemodel 3创建表。将表格插入滚动窗格,停止。所有更改都必须通过表模型进行。看教程哦,好吧,很抱歉。新模型在主类(MyProgram)中声明。它被添加为JTable(电子表格)的表格模型,然后电子表格被添加到滚动窗格中。我的问题是,当用户单击按钮或下拉列表中的某个内容时,我想更新jtable中的值。我尝试将排序后的数据添加到新模型中(即电子表格=新JTable(新MyModel)),但它没有按照我的计划进行。然后它应该可以工作,我只注意到您使用的是Rs arrayList,如果这是备份模型的列表,则它永远不会被清除,因此会向模型中添加新行,而不会替换现有行。为了得到更好的答案,请发帖子a,否则我们只能猜测问题所在。