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.

column 2 , 3 switched

whereas should (where "column 1" , "column 2" remain unsorted)

column 2 , 3 switch properly

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 (from rowsorterlisteners event)

  • by default never need know ordering jtables view, events models events,

  • add tablecolumnmodellistener in case want trace columnmoved, events sorting programatically painted in jtables view correctly

  • 1st. attemtp without column reordering,

enter image description here

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)

enter image description here

.

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

Popular posts from this blog

get url and add instance to a model with prefilled foreign key :django admin -

css - Make div keyboard-scrollable in jQuery Mobile? -

android - Keyboard hides my half of edit-text and button below it even in scroll view -