Java 基于隐藏列的JTable排序
我想根据一个隐藏列对Java 基于隐藏列的JTable排序,java,swing,sorting,jtable,tablerowsorter,Java,Swing,Sorting,Jtable,Tablerowsorter,我想根据一个隐藏列对JTable行进行排序 假设我有一个像这样的JTable column1 column2 val1 val2 现在我又有一个隐藏的专栏,我不想展示。当用户单击Column2时,它应该根据Column3(隐藏列)而不是Column2对行进行排序 如何在JTable中实现这一点 使用此处发布的代码: 有变量/方法参数col-只需检查它是否属于您的列2,如果是,则将其视为您的隐藏列-按它排序并重新排序表。默认情况下,您可以添加到,但没有比Darryl的更好、更清晰
JTable
行进行排序
假设我有一个像这样的JTable
column1 column2
val1 val2
现在我又有一个隐藏的专栏,我不想展示。当用户单击Column2时,它应该根据Column3(隐藏列)而不是Column2对行进行排序
如何在JTable中实现这一点 使用此处发布的代码:
有变量/方法参数col
-只需检查它是否属于您的列2,如果是,则将其视为您的隐藏列-按它排序并重新排序表。默认情况下,您可以添加到,但没有比Darryl的更好、更清晰的了
注:RowSorter的定义仅对混凝土表列有效
siple示例(再次使用较少的平衡器)
import java.awt.*;
导入java.awt.event.*;
导入javax.swing.*;
导入javax.swing.table.*;
公共类标题双击测试{
私有字符串[]列名称={“字符串”、“整数”、“布尔值”};
私有对象[][]数据={
{“aaa”,12,正确},{“bbb”,5,错误},
{“CCC”,92,true},{“DDD”,0,false}
};
private TableModel model=新的DefaultTableModel(数据、列名){
私有静态最终长serialVersionUID=1L;
@凌驾
公共类getColumnClass(int列){
返回getValueAt(0,列).getClass();
}
};
专用JTable表=新JTable(模型);
私有JTableHeader;
静态类TestTableRowSorter扩展了TableRowSorter{
TestTableRowSorter(表格型号m){
超级(m);
}
@凌驾
公共无效切换排序器(int列){
}
public void wraptogglesortororder(int列){
super.toggleSortOrder(列);
}
}
私有计时器=新计时器(400,新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
系统输出打印项次(“单一”);
JTable table=header.getTable();
行分拣机;
if(pt!=null&&table!=null&&table(sorter=table.getRowSorter())!=null){
int columnIndex=页眉.columnAtPoint(pt);
如果(列索引!=-1){
columnIndex=table.convertColumnIndexToModel(columnIndex);
((TestTableRowSorter)分类器)。WraptogleSortOrder(columnIndex);
}
}
}
});
私人点;
公共JComponent makeUI(){
timer.setRepeats(假);
表.setRowSorter(新测试表RowSorter(型号));
header=table.getTableHeader();
header.addMouseListener(新的MouseAdapter(){
@凌驾
公共无效鼠标点击(最终鼠标事件e){
if(timer.isRunning()&&!e.isConsumed()&&e.getClickCount()>1){
系统输出打印项次(“双”);
pt=null;
timer.stop();
}否则{
pt=e.getPoint();
timer.restart();
}
}
});
JPanel p=newjpanel(newborderlayout());
p、 添加(新JScrollPane(表));
返回p;
}
公共静态void main(字符串[]args){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
createAndShowGUI();
}
});
}
公共静态void createAndShowGUI(){
JFrame f=新的JFrame();
f、 setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f、 getContentPane().add(新建标题DoubleClickTest().makeUI());
f、 设置大小(320240);
f、 setLocationRelativeTo(空);
f、 setVisible(真);
}
}
一种方法是实现类型列2
的接口,如图所示,并使用相应的列3
值进行比较。方便的是,如果Column3
已经实现了Comparable
,您可以直接委托给Column3
,就像使用Double
一样,我是否需要将hiddlen列索引传递给WraptogleSortOrder(int列)?它会根据隐藏列进行排序吗?@Umesh:这是一个很好的例子,可以拦截标题单击并区分单击和双击,如果您还需要该功能的话;但它并没有直接处理排序顺序。另见此+1对于。为了迷惑用户;-)+1这可能有助于支持旧版本;另见此。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
public class HeaderDoubleclickTest {
private String[] columnNames = {"String", "Integer", "Boolean"};
private Object[][] data = {
{"aaa", 12, true}, {"bbb", 5, false},
{"CCC", 92, true}, {"DDD", 0, false}
};
private TableModel model = new DefaultTableModel(data, columnNames) {
private static final long serialVersionUID = 1L;
@Override
public Class<?> getColumnClass(int column) {
return getValueAt(0, column).getClass();
}
};
private JTable table = new JTable(model);
private JTableHeader header;
static class TestTableRowSorter extends TableRowSorter<TableModel> {
TestTableRowSorter(TableModel m) {
super(m);
}
@Override
public void toggleSortOrder(int column) {
}
public void wrapToggleSortOrder(int column) {
super.toggleSortOrder(column);
}
}
private Timer timer = new Timer(400, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("single");
JTable table = header.getTable();
RowSorter sorter;
if (pt != null && table != null && (sorter = table.getRowSorter()) != null) {
int columnIndex = header.columnAtPoint(pt);
if (columnIndex != -1) {
columnIndex = table.convertColumnIndexToModel(columnIndex);
((TestTableRowSorter) sorter).wrapToggleSortOrder(columnIndex);
}
}
}
});
private Point pt;
public JComponent makeUI() {
timer.setRepeats(false);
table.setRowSorter(new TestTableRowSorter(model));
header = table.getTableHeader();
header.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(final MouseEvent e) {
if (timer.isRunning() && !e.isConsumed() && e.getClickCount() > 1) {
System.out.println("double");
pt = null;
timer.stop();
} else {
pt = e.getPoint();
timer.restart();
}
}
});
JPanel p = new JPanel(new BorderLayout());
p.add(new JScrollPane(table));
return p;
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
createAndShowGUI();
}
});
}
public static void createAndShowGUI() {
JFrame f = new JFrame();
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f.getContentPane().add(new HeaderDoubleclickTest().makeUI());
f.setSize(320, 240);
f.setLocationRelativeTo(null);
f.setVisible(true);
}
}