i added jcombobox jtable:
table.getcolumnmodel().getcolumn(16).setcelleditor(new defaultcelleditor(c = new jcombobox())); c.additemlistener(new citemlistener()); the listener fired when (de)selecting item. that's fine. problem however, say: i've got "b" selected in 1 rows combobox, , "a" in another. when have combobox + row of "b" selected , select row "a", listener fired item "b" deselected , "a" selected, although did not change selection itself. true if click on combobox(without changing selection), not if select row somewhere else.
can behaviour changed? if so: how?
goal: listener fired when selection made, not when combobox de/selected without changing item.
listener:
@override public void itemstatechanged(itemevent ie) { string s = ""; if (ie.getstatechange() == itemevent.selected){ if (table.getselectedrow() != -1){ s = table.getmodel().getvalueat(table.convertrowindextomodel(table.getselectedrow()), 1) ); anothertable.increasecountfor(s); } } else if (ie.getstatechange() == itemevent.deselected){ if (table.getselectedrow() != -1){ s = table.getmodel().getvalueat(table.convertrowindextomodel(table.getselectedrow()), 1) ); anothertable.decreasecountfor(s); } }
problems current approach
as listening itemstatechanged of combobox called rows if 1 row changed,as expected behavior.[try putting print statement in listener see this]
there no need listen combobox change want listen in column change of table
as incrementing based on value of combobox values.i came following solution.
there maintable in 2nd column[index 1] dropdown. whenever combobox value changed row in maintable oldvalue decremented , newvalue ins incremented in countertable.
i have overridden defaulttablemodel whenever setvalue called check whether our desired column , if decrement old value , increment new value in counter table
just run below sscce code , select values second column , see changes
the following you've asked for
import java.awt.borderlayout; import java.util.objects; import javax.swing.defaultcelleditor; import javax.swing.defaultcomboboxmodel; import javax.swing.jcombobox; import javax.swing.jframe; import javax.swing.jtable; import javax.swing.table.defaulttablemodel; public class tabledropdown extends jframe { private jcombobox jcombobox1; private jtable maintable = new jtable(); private jtable countertable = new jtable(); public tabledropdown() { initialize(); } private void initialize() { //loading maintable sample values defaulttablemodel model = new defaulttablemodel(new object[][]{ {"test", null, null}, {"type", null, null}, {"what", null, null}, {"which", null, null} }, new string[]{ "title 1", "title 2", "title 3" }) { @override //main part trick public void setvalueat(object newvalue, int row, int column) { //check if our column if (column == 1) { object oldvalue = getvalueat(row, column); if (!objects.equals(newvalue, oldvalue)) { if (oldvalue != null) { decreasecountfor(oldvalue.tostring()); } increasecountfor(newvalue.tostring()); } } super.setvalueat(newvalue, row, column); } }; maintable.setmodel(model); //loading countertable , combobox sample values j string[] contents = new string[10]; defaulttablemodel cmodel = new defaulttablemodel(null, new string[]{"type", "count"}); (int = 0; < 10; i++) { contents[i] = "" + (char) (i + 65); cmodel.addrow(new object[]{contents[i], 0}); } countertable.setmodel(cmodel); countertable.setenabled(false);//to disable editing jcombobox1 = new jcombobox(new defaultcomboboxmodel(contents)); //setting celleditor column 1 maintable.getcolumnmodel().getcolumn(1).setcelleditor(new defaultcelleditor(jcombobox1)); //stuffs add value frame add(new javax.swing.jscrollpane(maintable), borderlayout.center); add(new javax.swing.jscrollpane(countertable), borderlayout.east); pack(); setdefaultcloseoperation(jframe.exit_on_close); } public int getrowforvalue(string val) { (int = 0; < countertable.getrowcount(); i++) { if (countertable.getvalueat(i, 0).equals(val)) { return i; } } return -1; } public int getprevoiusvalue(int row) { return integer.parseint(countertable.getvalueat(row, 1).tostring()); } public void increasecountfor(string x) { int row = getrowforvalue(x); countertable.setvalueat(getprevoiusvalue(row) + 1, row, 1); } public void decreasecountfor(string x) { int row = getrowforvalue(x); countertable.setvalueat(getprevoiusvalue(row) - 1, row, 1); } public static void main(string[] args) { new tabledropdown().setvisible(true); } }
Comments
Post a Comment