java - SelectedItems empty if multiple rows selected using different columns -


i have tableview in selectionmode.multiple. using listchangelistener i'm able catch selection of multiple rows (by pressing shift).

however solution works if items being selected in same column or in area without columns. gif illustration 4 examples:

  1. ok: selecting 3 items using shift in state column
  2. ok: selecting 4 items using shift in idx column
  3. ok: selecting 4 items using shift starting state column area without columns
  4. error: trying select 4 items using shift starting state column data item column

selection of multiple items in different columns

the problem seems selecteditems-list apparently empty in last example. i'd appreciate regarding issue.

here approach:

observablelist<datarowmodel> datarows = fxcollections.observablearraylist(); datarows.addall(datasetmodel.getrows()); tabledatarow.setitems(datarows); tabledatarowstatecolumn.setcellvaluefactory(f -> f.getvalue().getstate());  tabledatarow.getselectionmodel().setselectionmode(selectionmode.multiple); tabledatarow.getselectionmodel().getselecteditems() .addlistener((listchangelistener.change<? extends datarowmodel> c) -> {     while (c.next()) {         c.getremoved().stream().foreach(remitem -> remitem.setselected(false));         c.getaddedsublist().stream().foreach(additem -> additem.setselected(true));         system.out.println(c.getlist()); //empty [] when selected using different columns     } }); 

just better understanding of code: setselected(...) sets booleanproperty on datarowmodel bound state-column.

without context reason using selected-property seems quite silly. however, there various other fragments of code changelisteners bound selected-property.

sscce ready run:

import javafx.application.application; import javafx.beans.property.booleanproperty; import javafx.beans.property.simplebooleanproperty; import javafx.beans.property.simplestringproperty; import javafx.beans.property.stringproperty; import javafx.collections.fxcollections; import javafx.collections.listchangelistener; import javafx.collections.observablelist; import javafx.scene.group; import javafx.scene.scene; import javafx.scene.control.selectionmode; import javafx.scene.control.tablecolumn; import javafx.scene.control.tableview; import javafx.stage.stage;  public class tableviewsample extends application {      private tableview<datarowmodel> tabledatarow = new tableview<datarowmodel>();     private tablecolumn<datarowmodel, string> tabledatarownamecolumn = new tablecolumn<>("data item");     private tablecolumn<datarowmodel, string> tabledatarowstatecolumn = new tablecolumn<>("state");      private final observablelist<datarowmodel> datarows =         fxcollections.observablearraylist(             new datarowmodel("concinna",  false),             new datarowmodel("concinna",  false),             new datarowmodel("concinna",  false),             new datarowmodel("concinna",  false),             new datarowmodel("concinna",  false)         );      public static void main(string[] args) {         launch(args);     }      @override     public void start(stage stage) {         scene scene = new scene(new group());         stage.settitle("table view sample");         stage.setwidth(500);         stage.setheight(500);          tabledatarow.setitems(datarows);         tabledatarownamecolumn.setcellvaluefactory(f -> f.getvalue().getname());         tabledatarowstatecolumn.setcellvaluefactory(f -> f.getvalue().getstate());          tabledatarow.getselectionmodel().setselectionmode(selectionmode.multiple);         tabledatarow.getselectionmodel().getselecteditems()           .addlistener((listchangelistener.change<? extends datarowmodel> c) -> {             while (c.next()) {                 c.getremoved().stream().foreach(remitem -> remitem.setselected(false));                     c.getaddedsublist().stream().foreach(additem -> additem.setselected(true));                             }         });          tabledatarow.getcolumns().addall(tabledatarownamecolumn, tabledatarowstatecolumn);          ((group) scene.getroot()).getchildren().addall(tabledatarow);          stage.setscene(scene);         stage.show();     }      public static class datarowmodel {         private stringproperty name = new simplestringproperty(this, "name", "");         private booleanproperty selected = new simplebooleanproperty(this, "selected", true);         private stringproperty state = new simplestringproperty(this, "state", "");          public datarowmodel(string name, boolean selected) {             this.name.setvalue(name);             this.selected.setvalue(selected);              this.selected.addlistener((observable, oldval, newval) -> {                 getstate(); // refresh state value             });         }          public stringproperty getname() {             return name;         }         public booleanproperty isselected() {             return selected;         }         public void setselected(boolean selected) {             if (this.selected.getvalue() != selected)                 this.selected.setvalue(selected);         }          public stringproperty getstate() {             string statestr = "";             if (selected.getvalue())                 statestr += "selected";             state.setvalue(statestr);             return state;         }     } } 

i able generate editing oracle's person tableview example.

this bug, filed https://bugs.openjdk.java.net/browse/jdk-8096787, , fixed in version 8u60 expected released in august 2015.


Comments

Popular posts from this blog

javascript - Google App Script ContentService downloadAsFile not working -

javascript - Function overwritting -

php - Find a regex to take part of Email -