java - Get Selected Rows in JTable using AbstractTableModel -


i have jtable using abstracttablemodel have jcheckbox in first column selecting rows. now, need selected rows table checked. right now, sequentially traversing first row last row , getting rows selected following,

list<integer> selectedrows = new arraylist<integer>(); for(int = 0; < table.getrowcount(); i++) {      if((boolean) table.getvaluat(i, 0)) {          selectedrows.add(i);      } } 

the problem here is, need traverse rows when ever need selected rows. right having 10 20 rows. in future around 5000 rows. question is, if there 5000 rows , if user selects 5000nd (last record) row need traverse 5000 rows selected row. think not approach.

one approach want implement is, add listener jcheckbox column, such when ever there change (selected/deselected) need update array of selected rows in listener class. in listener class when ever user selectes jcheckbox need call table.getselectedrow(..) , need store if jcheckbox selected.

are there better approaches ?

in example below, tablemodel updates set<integer> checked in implementation of setvalueat(). model of adjacent jlist listens table's model , displays selected row numbers. example assumes number of selected rows small compared number of rows. note use of treeset, iterator retains natural order of elements.

image

import java.awt.dimension; import java.awt.eventqueue; import java.awt.gridlayout; import java.util.arraylist; import java.util.list; import java.util.set; import java.util.treeset; import javax.swing.borderfactory; import javax.swing.defaultlistmodel; import javax.swing.jframe; import javax.swing.jlist; import javax.swing.jpanel; import javax.swing.jscrollpane; import javax.swing.jtable; import javax.swing.event.tablemodelevent; import javax.swing.event.tablemodellistener; import javax.swing.table.abstracttablemodel;  /** @see http://stackoverflow.com/a/13919878/230513 */ public class checktable {      private static final checkmodel model = new checkmodel(5000);     private static final jtable table = new jtable(model) {          @override         public dimension getpreferredscrollableviewportsize() {             return new dimension(150, 300);         }     };      public static void main(string[] args) {         eventqueue.invokelater(new runnable() {              @override             public void run() {                 jframe f = new jframe("checktable");                 f.setdefaultcloseoperation(jframe.exit_on_close);                 f.setlayout(new gridlayout(1, 0));                 f.add(new jscrollpane(table));                 f.add(new displaypanel(model));                 f.pack();                 f.setlocationrelativeto(null);                 f.setvisible(true);             }         });     }      private static class displaypanel extends jpanel {          private defaultlistmodel dlm = new defaultlistmodel();         private jlist list = new jlist(dlm);          public displaypanel(final checkmodel model) {             super(new gridlayout());             this.setborder(borderfactory.createtitledborder("checked"));             this.add(new jscrollpane(list));             model.addtablemodellistener(new tablemodellistener() {                  @override                 public void tablechanged(tablemodelevent e) {                     dlm.removeallelements();                     (integer integer : model.checked) {                         dlm.addelement(integer);                     }                 }             });         }     }      private static class checkmodel extends abstracttablemodel {          private final int rows;         private list<boolean> rowlist;         private set<integer> checked = new treeset<integer>();          public checkmodel(int rows) {             this.rows = rows;             rowlist = new arraylist<boolean>(rows);             (int = 0; < rows; i++) {                 rowlist.add(boolean.false);             }         }          @override         public int getrowcount() {             return rows;         }          @override         public int getcolumncount() {             return 2;         }          @override         public string getcolumnname(int col) {             return "column " + col;         }          @override         public object getvalueat(int row, int col) {             if (col == 0) {                 return row;             } else {                 return rowlist.get(row);             }         }          @override         public void setvalueat(object avalue, int row, int col) {             boolean b = (boolean) avalue;             rowlist.set(row, b);             if (b) {                 checked.add(row);             } else {                 checked.remove(row);             }             firetablerowsupdated(row, row);         }          @override         public class<?> getcolumnclass(int col) {             return getvalueat(0, col).getclass();         }          @override         public boolean iscelleditable(int row, int col) {             return col == 1;         }     } } 

Comments

Popular posts from this blog

OpenCV OpenCL: Convert Mat to Bitmap in JNI Layer for Android -

android - org.xmlpull.v1.XmlPullParserException: expected: START_TAG {http://schemas.xmlsoap.org/soap/envelope/}Envelope -

python - How to remove the Xframe Options header in django? -