Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.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 单击按钮时,如何刷新扩展AbstractTableModel以替换值的自定义jtable模型?_Java_Swing_User Interface_Jtable - Fatal编程技术网

Java 单击按钮时,如何刷新扩展AbstractTableModel以替换值的自定义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",

如何刷新JTable,以便在单击按钮时显示我将传入的新值

以下是我的自定义JTable模式:

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,否则我们只能猜测问题所在。