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.

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
Post a Comment