JTable: JComboBox ItemListener triggered without change -


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