java - Wrong column being sorted when JTable Header clicked -
i have following code rowsorterlistener
. purpose of sort column without affecting other columns.
import javax.swing.event.rowsorterlistener; import javax.swing.event.rowsorterevent; import javax.swing.jtable; import javax.swing.rowsorter.sortkey; import java.util.list; import java.util.arrays; public class unrelatedata implements rowsorterlistener { jtable table; int columnsorted = -1; object[][] datastore; public unrelatedata(jtable table) { this.table = table; } @override public void sorterchanged(rowsorterevent e) { if(e.gettype() == rowsorterevent.type.sort_order_changed) { list<sortkey> keys = e.getsource().getsortkeys(); (sortkey key : keys) { if (key.getcolumn() == -1) { columnsorted = -1; break; } else { columnsorted = key.getcolumn(); break; } } datastore = getdata(); } if(e.gettype() == rowsorterevent.type.sorted) { list<sortkey> keys = e.getsource().getsortkeys(); (sortkey key : keys) { if (key.getcolumn() == -1) { columnsorted = -1; break; } else { columnsorted = key.getcolumn(); break; } } for(int = 0; < table.getcolumncount(); i++) { if(i != columnsorted && columnsorted != -1) { (int j = 0; j < table.getrowcount(); j++) { table.setvalueat(datastore[i][j], j, i); } } } } } private object[][] getdata() { int columncount = table.getcolumncount(); int rowcount = table.getrowcount(); object[][] tempdata = new object[columncount][rowcount]; for(int = 0; < columncount; i++) { for(int j = 0; j < rowcount; j++) { tempdata[i][j] = table.getvalueat(j, i); } } return tempdata; }; }
this works well. however, there 1 major glitch. if column moved , try sort column doesn't correctly sort column. instead, incorrectly sorts column in original place of column moved.
whereas should (where "column 1" , "column 2" remain unsorted)
would able explain why occurs , how fix it?
note: not want use jtableheader.reorderingallowed(false)
edit
i added following loops code , tried different variations didn't seem work
attempt 1
if(e.gettype() == rowsorterevent.type.sorted) { int[] actualcolumn = new int[table.getcolumncount()]; for(int = 0; i<table.getcolumncount(); i++){ actualcolumn[i] = table.convertcolumnindextomodel(i); } int[] actualrow = new int[table.getrowcount()]; for(int = 0; i<table.getrowcount(); i++){ actualrow[i] = table.convertrowindextomodel(i); } list<sortkey> keys = e.getsource().getsortkeys(); (sortkey key : keys) { if (key.getcolumn() == -1) { columnsorted = -1; break; } else { columnsorted = key.getcolumn(); break; } } for(int = 0; < table.getcolumncount(); i++) { if(i != columnsorted && columnsorted != -1) { (int j = 0; j < table.getrowcount(); j++) { table.setvalueat(datastore[i][j], actualrow[j], actualcolumn[i]); } } } }
attempt 2
private object[][] getdata() { int columncount = table.getcolumncount(); int rowcount = table.getrowcount(); int[] actualcolumn = new int[columncount]; for(int = 0; i<table.getcolumncount(); i++){ actualcolumn[i] = table.convertcolumnindextomodel(i); } int[] actualrow = new int[rowcount]; for(int = 0; i<table.getrowcount(); i++){ actualrow[i] = table.convertrowindextomodel(i); } object[][] tempdata = new object[columncount][rowcount]; for(int = 0; < columncount; i++) { for(int j = 0; j < rowcount; j++) { tempdata[i][j] = table.getvalueat(actualrow[j], actualcolumn[i]); } } return tempdata; };
attempt 3 both attempt 1 , 2 put together
code in
rowsorterlistener
designatet returns index correctly (fromrowsorterlistener
s event)by default never need know ordering
jtable
s view, eventsmodels events
,add
tablecolumnmodellistener
in case want tracecolumnmoved
, events sorting programatically painted injtable
s view correctly1st. attemtp without column reordering,
column no. - 0 sorted column no. - 1 sorted column no. - 2 sorted column no. - 3 sorted column no. - 4 sorted ... , on build successful (total time: 21 seconds)
.
- 2nd. attempt column reordering (by mouse dragging)
.
column no. - 0 sorted columnmoved columnmodellistener columnmoved columnmodellistener columnmoved columnmodellistener columnmoved columnmodellistener columnmoved columnmodellistener columnmoved columnmodellistener columnselectionchanged columnmodellistener columnmoved columnmodellistener columnmoved columnmodellistener columnmoved columnmodellistener columnmoved columnmodellistener columnmoved columnmodellistener columnmoved columnmodellistener columnselectionchanged columnmodellistener columnselectionchanged columnmodellistener columnselectionchanged columnmodellistener columnmoved columnmodellistener columnmoved columnmodellistener columnmoved columnmodellistener columnmoved columnmodellistener columnmoved columnmodellistener columnmoved columnmodellistener columnmoved columnmodellistener columnmoved columnmodellistener columnmoved columnmodellistener columnmoved columnmodellistener columnmoved columnmodellistener columnmoved columnmodellistener column no. - 1 sorted columnmoved columnmodellistener columnmoved columnmodellistener columnmoved columnmodellistener columnmoved columnmodellistener columnmoved columnmodellistener columnmoved columnmodellistener columnmoved columnmodellistener columnselectionchanged columnmodellistener columnmoved columnmodellistener columnmoved columnmodellistener columnmoved columnmodellistener columnmoved columnmodellistener columnmoved columnmodellistener columnselectionchanged columnmodellistener columnselectionchanged columnmodellistener columnselectionchanged columnmodellistener columnmoved columnmodellistener columnmoved columnmodellistener columnmoved columnmodellistener columnmoved columnmodellistener columnmoved columnmodellistener columnmoved columnmodellistener columnselectionchanged columnmodellistener columnselectionchanged columnmodellistener columnselectionchanged columnmodellistener columnmoved columnmodellistener columnmoved columnmodellistener columnmoved columnmodellistener columnmoved columnmodellistener columnmoved columnmodellistener columnmoved columnmodellistener columnmoved columnmodellistener columnmoved columnmodellistener columnmoved columnmodellistener columnmoved columnmodellistener columnmoved columnmodellistener columnmoved columnmodellistener columnmoved columnmodellistener columnselectionchanged columnmodellistener columnselectionchanged columnmodellistener columnselectionchanged columnmodellistener columnmoved columnmodellistener columnmoved columnmodellistener columnmoved columnmodellistener columnmoved columnmodellistener columnmoved columnmodellistener columnmoved columnmodellistener columnmoved columnmodellistener columnmoved columnmodellistener columnmoved columnmodellistener columnmoved columnmodellistener columnmoved columnmodellistener column no. - 2 sorted columnmoved columnmodellistener columnmoved columnmodellistener columnmoved columnmodellistener columnmoved columnmodellistener columnmoved columnmodellistener column no. - 3 sorted column no. - 4 sorted column no. - 0 sorted column no. - 1 sorted column no. - 2 sorted build successful (total time: 10 seconds)
3rd. attempt same correct output if swing timer isn't initialized , event made users hand
for example
.
import java.awt.eventqueue; import java.awt.event.actionevent; import java.util.arrays; import java.util.list; import java.util.random; import javax.swing.*; import javax.swing.rowsorter.sortkey; import javax.swing.event.*; import javax.swing.table.*; public class sorttest1 { private jframe frame = new jframe(getclass().getsimplename()); private defaulttablemodel model = new defaulttablemodel(10, 5) { private static final long serialversionuid = 1l; @override public class<?> getcolumnclass(int column) { return getvalueat(0, column).getclass(); } }; private jtable table = new jtable(model); private tablerowsorter<?> sorter; private static final random rnd = new random(); private timer timer; private int columnno = 0; public sorttest1() { (int row = model.getrowcount(); --row >= 0;) { int = 20 + row % 20; model.setvalueat(row + " " + i, row, 0); model.setvalueat(i + row, row, 1); model.setvalueat(rnd.nextboolean(), row, 2); model.setvalueat(rnd.nextdouble(), row, 3); model.setvalueat(row + " " + * 1, row, 4); } table.setautocreaterowsorter(true); sorter = (tablerowsorter<?>) table.getrowsorter(); sorter.setsortsonupdates(true); sorter.addrowsorterlistener(new rowsorterlistener() { @override public void sorterchanged(rowsorterevent rse) { if (rse.gettype() == rowsorterevent.type.sort_order_changed) { list<sortkey> keys = rse.getsource().getsortkeys(); (sortkey key : keys) { system.out.println("column no. - " + key.getcolumn() + " sorted"); if (key.getcolumn() == 0) { break; } else { break; } } } } }); frame.add(new jscrollpane(table)); table.setpreferredscrollableviewportsize(table.getpreferredsize()); table.getcolumnmodel().addcolumnmodellistener(new tablecolumnmodellistener() { // handle columnmarginchanged re-paint headings @override public void columnmarginchanged(changeevent e) { system.out.println("columnmarginchanged columnmodellistener"); } @override public void columnadded(tablecolumnmodelevent e) { system.out.println("columnadded columnmodellistener"); } @override public void columnremoved(tablecolumnmodelevent e) { system.out.println("columnremovedfrom columnmodellistener"); } @override public void columnmoved(tablecolumnmodelevent e) { system.out.println("columnmoved columnmodellistener"); } @override public void columnselectionchanged(listselectionevent e) { system.out.println("columnselectionchanged columnmodellistener"); } }); frame.setdefaultcloseoperation(jframe.exit_on_close); frame.pack(); frame.setlocationrelativeto(null); frame.setvisible(true); timer = new javax.swing.timer(1000, updatecol()); timer.setrepeats(true); timer.start(); } private action updatecol() { return new abstractaction("sort jtable") { private static final long serialversionuid = 1l; @override public void actionperformed(actionevent e) { if (columnno > 4) { columnno = 0; sorter.setsortkeys(arrays.aslist(new rowsorter.sortkey(columnno, sortorder.ascending))); } else { sorter.setsortkeys(arrays.aslist(new rowsorter.sortkey(columnno, sortorder.ascending))); columnno++; } } }; } public static void main(string[] args) { eventqueue.invokelater(() -> { new sorttest1(); }); } }
Comments
Post a Comment