Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.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 添加行后对JTable进行排序_Java_Database_Swing_Sorting_Jtable - Fatal编程技术网

Java 添加行后对JTable进行排序

Java 添加行后对JTable进行排序,java,database,swing,sorting,jtable,Java,Database,Swing,Sorting,Jtable,添加新行后,我必须对JTable(Object[]data,Object[]headers)进行排序 这是代码(不起作用) 公共类窗口扩展JFrame{ 窗口(){ 超级(); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); JTable table=新的JTable(); setModel(新的DefaultTableModel(null,新字符串[]{“col1”})); TableRowSorter-sorter=新的Tab

添加新行后,我必须对
JTable(Object[]data,Object[]headers)
进行排序

这是代码(不起作用)

公共类窗口扩展JFrame{
窗口(){
超级();
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
JTable table=新的JTable();
setModel(新的DefaultTableModel(null,新字符串[]{“col1”}));
TableRowSorter-sorter=新的TableRowSorter(table.getModel());
sorter.setComparator(0,新比较器(){
@凌驾
公共整数比较(字符串o1、字符串o2){
返回o1。与(o2)相比;
}
});
分拣机。设置分拣更新(真);
表.SetRow分拣机(分拣机);
DefaultTableModel=(DefaultTableModel)table.getModel();
addRow(新字符串[]{“A”});
addRow(新字符串[]{“C”});
addRow(新字符串[]{“B”});
this.getContentPane().add(表);
包装();
setVisible(真);
}
公共静态void main(字符串[]args){
新窗口();
}
}
输出结果:表(A,C,B),预期(A,B,C)

模型-默认表模型
deviceTable-Jtable

model.fireTableDataChanged();
不要直接调用fireXXX()方法

TableModel负责调用适当的方法(在本例中,该方法将是fireTableRowsInserted)

编辑:

去掉创建分类器和比较器的代码

您只需让表创建分类器。但是,一旦您这样做,您需要告诉分拣机要对哪个列进行分拣:

table.setAutoCreateRowSorter(true);
((DefaultRowSorter)table.getRowSorter()).toggleSortOrder(0);
不要直接调用fireXXX()方法

TableModel负责调用适当的方法(在本例中,该方法将是fireTableRowsInserted)

编辑:

去掉创建分类器和比较器的代码

您只需让表创建分类器。但是,一旦您这样做,您需要告诉分拣机要对哪个列进行分拣:

table.setAutoCreateRowSorter(true);
((DefaultRowSorter)table.getRowSorter()).toggleSortOrder(0);

根据您的示例,您需要定义一个排序键,否则该表将被有效地取消排序

List<RowSorter.SortKey> sortKeys = new ArrayList<RowSorter.SortKey>();
sortKeys.add(new RowSorter.SortKey(0, SortOrder.ASCENDING));
sorter.setSortKeys(sortKeys);
table.setRowSorter(sorter);
List sortKeys=new ArrayList();
添加(新的行排序器.SortKey(0,排序器.升序));
分拣机设置快捷键(快捷键);
表.SetRow分拣机(分拣机);
下面的示例(基于您的示例)对第一列进行排序。当您点击按钮时,它会添加行,然后对行进行排序

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.RowSorter;
import javax.swing.SortOrder;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                JTable table = new JTable();
                table.setModel(new DefaultTableModel(null, new String[]{"col1"}));
                TableRowSorter<TableModel> sorter = new TableRowSorter<>(table.getModel());
                sorter.setComparator(0, new Comparator<String>() {
                    @Override
                    public int compare(String o1, String o2) {
                        return o1.compareTo(o2);
                    }
                });
                sorter.setSortsOnUpdates(true);
                List<RowSorter.SortKey> sortKeys = new ArrayList<RowSorter.SortKey>();
                sortKeys.add(new RowSorter.SortKey(0, SortOrder.ASCENDING));
                sorter.setSortKeys(sortKeys);
                table.setRowSorter(sorter);

                JButton btn = new JButton("...");
                btn.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        DefaultTableModel model = (DefaultTableModel) table.getModel();
                        model.addRow(new String[]{"A"});
                        model.addRow(new String[]{"C"});
                        model.addRow(new String[]{"B"});
                    }
                });

                frame.add(new JScrollPane(table));
                frame.add(btn, BorderLayout.SOUTH);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

}
导入java.awt.BorderLayout;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.util.ArrayList;
导入java.util.Comparator;
导入java.util.List;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JScrollPane;
导入javax.swing.JTable;
导入javax.swing.RowSorter;
导入javax.swing.SortOrder;
导入javax.swing.SwingUtilities;
导入javax.swing.table.DefaultTableModel;
导入javax.swing.table.TableModel;
导入javax.swing.table.TableRowSorter;
公开课考试{
公共静态void main(字符串[]args){
新测试();
}
公开考试(){
SwingUtilities.invokeLater(新的Runnable(){
@凌驾
公开募捐{
JFrame=新JFrame();
JTable table=新的JTable();
setModel(新的DefaultTableModel(null,新字符串[]{“col1”}));
TableRowSorter-sorter=新的TableRowSorter(table.getModel());
sorter.setComparator(0,新比较器(){
@凌驾
公共整数比较(字符串o1、字符串o2){
返回o1。与(o2)相比;
}
});
分拣机。设置分拣更新(真);
List sortKeys=new ArrayList();
添加(新的行排序器.SortKey(0,排序器.升序));
分拣机设置快捷键(快捷键);
表.SetRow分拣机(分拣机);
JButton btn=新JButton(“…”);
btn.addActionListener(新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
DefaultTableModel=(DefaultTableModel)table.getModel();
addRow(新字符串[]{“A”});
addRow(新字符串[]{“C”});
addRow(新字符串[]{“B”});
}
});
frame.add(新的JScrollPane(表));
添加框架(btn,BorderLayout.SOUTH);
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
});
}
}

根据您的示例,您需要定义一个排序键,否则该表将被有效地取消排序

List<RowSorter.SortKey> sortKeys = new ArrayList<RowSorter.SortKey>();
sortKeys.add(new RowSorter.SortKey(0, SortOrder.ASCENDING));
sorter.setSortKeys(sortKeys);
table.setRowSorter(sorter);
List sortKeys=new ArrayList();
添加(新的行排序器.SortKey(0,排序器.升序));
分拣机设置快捷键(快捷键);
表.SetRow分拣机(分拣机);
下面的示例(基于您的示例)对第一列进行排序。当您点击按钮时,它会添加行,然后对行进行排序

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.RowSorter;
import javax.swing.SortOrder;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                JTable table = new JTable();
                table.setModel(new DefaultTableModel(null, new String[]{"col1"}));
                TableRowSorter<TableModel> sorter = new TableRowSorter<>(table.getModel());
                sorter.setComparator(0, new Comparator<String>() {
                    @Override
                    public int compare(String o1, String o2) {
                        return o1.compareTo(o2);
                    }
                });
                sorter.setSortsOnUpdates(true);
                List<RowSorter.SortKey> sortKeys = new ArrayList<RowSorter.SortKey>();
                sortKeys.add(new RowSorter.SortKey(0, SortOrder.ASCENDING));
                sorter.setSortKeys(sortKeys);
                table.setRowSorter(sorter);

                JButton btn = new JButton("...");
                btn.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        DefaultTableModel model = (DefaultTableModel) table.getModel();
                        model.addRow(new String[]{"A"});
                        model.addRow(new String[]{"C"});
                        model.addRow(new String[]{"B"});
                    }
                });

                frame.add(new JScrollPane(table));
                frame.add(btn, BorderLayout.SOUTH);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

}
导入java.awt.BorderLayout;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.util.ArrayList;
导入java.util.Comparator;
导入java.util.List;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JScrollPane;
导入javax.swing.JTable;
导入javax.swing.RowSorter;
导入javax.swing.SortOrder;
导入javax.swing.SwingUtilities;
导入javax.swing.table.DefaultTableModel;
导入javax.swing.table.TableModel;
导入javax.swing.table.TableRowSorter;
公开课考试{
公共静态void main(字符串[]args){
新测试();
}
公开考试(){
SwingUtilities.invokeLater(新的Runnable(){
@凌驾
公开募捐{
JFrame=新JFrame();
JTable table=新的JTable();
表1.setM