java - Display TableView<ObservableList<String>> inside TreeView<E> -


the design had in mind this: there's treeview<e>, e wrapper class implementation this:

public class e {     private int key;     private string value;      public e(int key, string value) {         this.key = key;         this.value = value;     }      public int getkey(){         return key;      }      public string getvalue() {         return value;     }      public string tostring(){         return value;     } } 

so treeview<e> contain bunch of treeitem<e> instances. , tostring() method of e displays value.

and when press of tree items, want tableview<observablelist<string>> shown below selected treeitem<e> containing rows db connected key value of treeitem<e>.

is possible? know treetableview decent option, don't want show columns unless press 1 of tree items. , want each treeitem<e> have own table. although, record, tables have same columns, different amount of rows.

update: of @uluk biy i've managed implement solution, contains 1 bug.

the problem when press treeitem in treeview, node gets selected node 2 steps below first node isn't visible in scroll pane when press treeitem (treeview automatically contains scroll pane). if stretch window less 3 tree items hidden, nothing show. , it's not tableview gets shown @ wrong place, problem right tree item isn't selected (i know because i've printed out key value.

here sscce shows bug. select wrapper 1 in table, , wrapper 6 selected one. if change size of treeview less 3 treeitems hidden, nothing selected.

import javafx.application.application; import javafx.beans.property.simplestringproperty; import javafx.collections.fxcollections; import javafx.collections.observablelist; import javafx.scene.scene; import javafx.scene.control.label; import javafx.scene.control.tablecolumn; import javafx.scene.control.tableview; import javafx.scene.control.treecell; import javafx.scene.control.treeitem; import javafx.scene.control.treeview; import javafx.scene.layout.anchorpane; import javafx.scene.layout.vbox; import javafx.stage.stage; import javafx.util.callback;  public class sscce extends application {      private stage primarystage;     private anchorpane rootlayout;     private treeview<wrapper> overview;       public void start(stage primarystage) {         this.primarystage = primarystage;         this.primarystage.settitle("sscce");          initrootlayout();         showtreeview();     }      public void initrootlayout() {         rootlayout = new anchorpane();         rootlayout.setprefsize(300, 200);          scene scene = new scene(rootlayout);         primarystage.setscene(scene);          primarystage.show();     }             observablelist<string> columns = fxcollections.observablearraylist();     observablelist<observablelist<string>> data = fxcollections.observablearraylist();     observablelist<wrapper> items = fxcollections.observablearraylist();      private void showtreeview() {          // dummy values         columns.addall("key", "text");                       data.add(fxcollections.observablearraylist("1", "test"));         data.add(fxcollections.observablearraylist("1", "test2"));         data.add(fxcollections.observablearraylist("2", "test3"));         data.add(fxcollections.observablearraylist("2", "test4"));         data.add(fxcollections.observablearraylist("3", "test5"));         data.add(fxcollections.observablearraylist("3", "test6"));         data.add(fxcollections.observablearraylist("4", "test7"));         data.add(fxcollections.observablearraylist("4", "test8"));         data.add(fxcollections.observablearraylist("5", "test9"));         data.add(fxcollections.observablearraylist("5", "test10"));         data.add(fxcollections.observablearraylist("6", "test11"));         data.add(fxcollections.observablearraylist("6", "test12"));         items.addall(new wrapper(1, "wrapper 1"), new wrapper(2, "wrapper 2"), new wrapper(3, "wrapper 3"), new wrapper(4, "wrapper 4"), new wrapper(5, "wrapper 5"), new wrapper(6, "wrapper 6"));          treeitem<wrapper> root = new treeitem<wrapper>();         overview = new treeview<wrapper>(root);         overview.setprefheight(75);          overview.setcellfactory(new callback<treeview<wrapper>, treecell<wrapper>>() {             @override             public treecell<wrapper> call(treeview<wrapper> stringtreeview) {                 treecell<wrapper> treecell = new treecell<wrapper>() {                     @override                     protected void updateitem(wrapper item, boolean empty) {                         super.updateitem(item, empty);                         if (empty || item == null) {                             settext(null);                             setgraphic(null);                         } else {                             if (gettreeitem().isleaf() && isselected()) {                                 settext(null);                                  // debug text proves wrong item being selected.                                 system.out.println("selected wrapper: " + item);                                  tableview<observablelist<string>> table = new tableview<observablelist<string>>();                                 (int = 0; < columns.size(); i++) {                                     final int j = i;                                      tablecolumn<observablelist<string>, string> column = new tablecolumn<observablelist<string>, string>(                                             columns.get(i));                                      column.setcellvaluefactory((                                             tablecolumn.celldatafeatures<observablelist<string>, string> param) -> new simplestringproperty(                                             param.getvalue().get(j)                                                     .tostring()));                                      table.getcolumns()                                             .add(column);                                 }                                  observablelist<observablelist<string>> selected_data = fxcollections                                         .observablearraylist();                                  for(int = 0; < data.size(); i++) {                                      if(integer.parseint(data.get(i).get(0)) == item.getkey()) {                                         selected_data.add(data.get(i));                                     }                                 }                                 table.setitems(selected_data);                                  vbox vbox = new vbox(new label(item                                         .getvalue()), table);                                 setgraphic(vbox);                             } else {                                 settext(item.getvalue());                                 setgraphic(null);                             }                         }                     }                 };                 return treecell;             }         });          (int = 0; < items.size(); i++) {             treeitem<wrapper> target = new treeitem<wrapper>(items.get(i));             root.getchildren().add(target);         }          overview.setshowroot(false);         rootlayout.getchildren().add(overview);      }      public static void main(string[] args) {         launch(args);     } }  class wrapper {     private int key;     private string value;      wrapper(int key, string value) {         this.key = key;         this.value = value;     }      int getkey() {         return key;     }      string getvalue() {         return value;     }      public string tostring() {         return "wrapper " + key;     } } 

setting custom cell factory not way go here. because cells reused render multiple items, if cells visible within treeview's viewport, default selection of item not trigger reusage of cell, no invocation on updateitem(). on other hand, if there other items beyond viewport , user scrolls down them cell of upper invisible item reused render below ones newly entered viewport. imo explanation of behavior described in comment below. in short, defining custom treecell not correct approach, instead can observe item selection changes , set graphic in there:

treeview.getselectionmodel().selecteditemproperty().addlistener( ( observablevalue<? extends treeitem<wrapper>> observable,         treeitem<wrapper> oldvalue, treeitem<wrapper> newvalue ) ->         {             system.out.println( "selected newvalue: " + newvalue );              if ( oldvalue != null )             {                 // hide graphic of previous selected item                 oldvalue.setgraphic( null );             }              if ( newvalue != null )             {                 tableview<observablelist<string>> table = new tableview<>();                 ( int = 0; < columns.size(); i++ )                 {                     final int j = i;                      tablecolumn<observablelist<string>, string> column = new tablecolumn<>(                             columns.get( ) );                      column.setcellvaluefactory( (                                     tablecolumn.celldatafeatures<observablelist<string>, string> param ) ->                              new simplestringproperty( param.getvalue().get( j ) ) );                      table.getcolumns().add( column );                 }                  observablelist<observablelist<string>> selected_data = fxcollections                 .observablearraylist();                  ( int = 0; < data.size(); i++ )                 {                     if ( integer.parseint( data.get( ).get( 0 ) ) == newvalue.getvalue().getkey() )                     {                         selected_data.add( data.get( ) );                     }                 }                 table.setitems( selected_data );                 vbox vbox = new vbox( new label( newvalue.getvalue().getvalue() ), table );                 newvalue.setgraphic( vbox );             }         } ); 

and not set treeview.setcellfactory(...). problem how hide item's text.


Comments

Popular posts from this blog

angularjs - ADAL JS Angular- WebAPI add a new role claim to the token -

php - CakePHP HttpSockets send array of paramms -

node.js - Using Node without global install -