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