Collections in JavaFX

Perhaps a newbie question, but is there a Map class (name value pairs) in JavaFX?
If try to use java Collections in in JavaFX, something like
var idMap: Map<String, Integer>;I get the error message "Java generic type declarations are not currently supported."
Is there a preferred way to get such functionality in JavaFx?
Thanks

The generics are not supported in JavaFX Script now.
Use the standard Java map classes:
import java.util.HashMap;
var idMap = new HashMap();
idMap.put(3, "Three");
var three = idMap.get(3) as String;

Similar Messages

  • Instance of javafx.collections.FXCollections can not be create by FXML load

    <ListView>
    <items>
    <FXCollections fx:factory="observableArrayList">
    <String fx:value="One"/>
    <String fx:value="Two"/>
    <String fx:value="Three"/>
    <String fx:value="Four"/>
    <String fx:value="Five"/>
    </FXCollections>
    </items>
    </ListView>
    why the netBeans 7.3beta2 say "Instance of javafx.collections.FXCollections can not be create by FXML loader"?

    Hi,
    PLS-00201 : identifier 'v$INSTANCE' must be declared. Please note that, this package having a procedure that is loading a text files rows to table. Its using UTL_FILE package.
    And directories are used to load the data. I created the directories in the TEST database and create the physical directory in the TEST database host machine. 1. when issuue was raised from pl/sql - have you check the code ?
    2. Have you tested code independently - instead of executing from job. ?
    3. Forget about production system for a while, try to check the pre-requisites required for the things to run. ?
    4. what is the pacakge code dependent on v$instance error - have you checked across ?
    5. Have you tried to debug the code or not ?
    - Pavan Kumar N

  • JavaFX Pie Chart populate from existing collections

    Hi.
    I have a Person object with the structure Person(firstname,lastname,email, salary)
    I would like to draw a chart with the columns email and salary.
    I maintain the collection of objects in ObservableList which is populating a TableView.
    To populate a piechart, is it possible to use the same collection instead of creating a new collection for PieChart Data?

    private final ObservableList<Person> data =
    FXCollections.observableArrayList(
    new Person("Jacob ", "Smith", "[email protected]",new Float(1.0)),
    new Person("Isabella", "test", "[email protected]",new Float(2.0)),
    new Person("dsd", "Johnson", "[email protected]",new Float(3.0)),
    new Person("Ethan", "Williams", "[email protected]",new Float(1.0)),
    new Person("Emma", "Jones", "[email protected]",new Float(2.0)),
    new Person("test", "test1", "[email protected]",new Float(5.0)),
    new Person("Michael", "Brown", "[email protected]",new Float(2.0))
    I iterate through the above collection and populate a piechartdata collection
    ObservableList<PieChart.Data> pieChartData ;
    /* Itereate and add to colletion */
    new PieChart.Data(<employee_email>,<salary>);
    /* Iterate ends */
    final PieChart chart = new PieChart(pieChartData);
    is there any alternate way to populate pieChartData without iterating through the list.

  • JavaFX Update Line Chart on Tab pane

    Hi all,
    I am wondering can anybody help with this problem.
    I have an application that can create a new tab when the LineChart FXML view is called by way of onMouseClicked event from a bar graph (using scenebuilder). However, I need this Line chart to update when the user clicks a new bar on the bar graph page to show this new data.
    Initially the Line chart tab will open and display data from the first bar graph click and when I click another bar in Tab A (bar chart) if it has the same number of rows it will refresh the LineChart tab otherwise I get an error. Then if I try to load another line graph tab using a different bar graph as the source I get a child duplication error
    (So tab A has a bar graph that calls tab B to represent data as a line graph, however it wont do it more then once when there is a different number of points to show)
    (Also tab C, another Bar chart will not load a new tab) Exceptions below & Class detail below.
    I am using clear() to empty the observable list I have which is used to populate the graph and table before it reads in the new data values
    What is the proper way/ best way to dynamically add another tab and update the chart in the tab with new values? Any help would be appreciated.
    I am getting the following exceptions:
    Exception in thread "JavaFX Application Thread" java.lang.IndexOutOfBoundsException: Index: 11, Size: 7
      at java.util.ArrayList.rangeCheckForAdd(ArrayList.java:661)
      at java.util.ArrayList.add(ArrayList.java:473)
      at com.sun.javafx.collections.ObservableListWrapper.doAdd(ObservableListWrapper.java:101)
      at javafx.collections.ModifiableObservableListBase.add(ModifiableObservableListBase.java:151)
      at com.sun.javafx.collections.VetoableListDecorator.add(VetoableListDecorator.java:320)
      at com.sun.javafx.scene.control.skin.TabPaneSkin$TabHeaderArea.addTab(TabPaneSkin.java:854)
      at com.sun.javafx.scene.control.skin.TabPaneSkin$TabHeaderArea.access$500(TabPaneSkin.java:659)
      at com.sun.javafx.scene.control.skin.TabPaneSkin.addTabs(TabPaneSkin.java:276)
      at com.sun.javafx.scene.control.skin.TabPaneSkin.lambda$initializeTabListener$463(TabPaneSkin.java:357)
      at com.sun.javafx.scene.control.skin.TabPaneSkin$$Lambda$108/885312968.onChanged(Unknown Source)
      at com.sun.javafx.collections.ListListenerHelper$Generic.fireValueChangedEvent(ListListenerHelper.java:329)
      at com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(ListListenerHelper.java:73)
      at javafx.collections.ObservableListBase.fireChange(ObservableListBase.java:233)
      at javafx.collections.ListChangeBuilder.commit(ListChangeBuilder.java:482)
      at javafx.collections.ListChangeBuilder.endChange(ListChangeBuilder.java:541)
      at javafx.collections.ObservableListBase.endChange(ObservableListBase.java:205)
      at javafx.collections.ModifiableObservableListBase.add(ModifiableObservableListBase.java:155)
      at java.util.AbstractList.add(AbstractList.java:108)
      at javafxapplication2.FXMLExecutionChartController$3.handle(FXMLExecutionChartController.java:262)
      at javafxapplication2.FXMLExecutionChartController$3.handle(FXMLExecutionChartController.java:241)
      at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
      at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
      at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
      at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
      at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
      at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
      at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
      at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
      at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
      at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
      at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
      at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
      at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
      at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
      at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
      at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
      at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
      at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
      at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
      at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
      at javafx.event.Event.fireEvent(Event.java:198)
      at javafx.scene.Scene$ClickGenerator.postProcess(Scene.java:3437)
      at javafx.scene.Scene$ClickGenerator.access$7900(Scene.java:3365)
      at javafx.scene.Scene$MouseHandler.process(Scene.java:3733)
      at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3452)
      at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1728)
      at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2461)
      at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:348)
      at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:273)
      at java.security.AccessController.doPrivileged(Native Method)
      at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:382)
      at com.sun.glass.ui.View.handleMouseEvent(View.java:553)
      at com.sun.glass.ui.View.notifyMouse(View.java:925)
      at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
      at com.sun.glass.ui.win.WinApplication.lambda$null$141(WinApplication.java:102)
      at com.sun.glass.ui.win.WinApplication$$Lambda$37/1146743572.run(Unknown Source)
      at java.lang.Thread.run(Thread.java:745)
    Exception in thread "JavaFX Application Thread" java.lang.NullPointerException
      at javafxapplication2.FXMLExecutionChartController$3.handle(FXMLExecutionChartController.java:263)
      at javafxapplication2.FXMLExecutionChartController$3.handle(FXMLExecutionChartController.java:241)
      at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
      at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
      at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
      at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
      at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
      at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
      at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
      at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
      at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
      at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
      at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
      at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
      at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
      at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
      at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
      at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
      at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
      at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
      at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
      at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
      at javafx.event.Event.fireEvent(Event.java:198)
      at javafx.scene.Scene$ClickGenerator.postProcess(Scene.java:3437)
      at javafx.scene.Scene$ClickGenerator.access$7900(Scene.java:3365)
      at javafx.scene.Scene$MouseHandler.process(Scene.java:3733)
      at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3452)
      at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1728)
      at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2461)
      at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:348)
      at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:273)
      at java.security.AccessController.doPrivileged(Native Method)
      at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:382)
      at com.sun.glass.ui.View.handleMouseEvent(View.java:553)
      at com.sun.glass.ui.View.notifyMouse(View.java:925)
      at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
      at com.sun.glass.ui.win.WinApplication.lambda$null$141(WinApplication.java:102)
      at com.sun.glass.ui.win.WinApplication$$Lambda$37/1146743572.run(Unknown Source)
      at java.lang.Thread.run(Thread.java:745)
    Class Information:
    //Call to the Line chart graph
    n.setOnMouseClicked(new EventHandler<MouseEvent>()
                    @Override
                    public void handle ( MouseEvent e )
                        String s1 = dt.getXValue();
                        String s = s1.trim();
                        if ( baseHash.containsKey(s) )
                            String value = (String) baseHash.get(s);
                            String hashValue = value.substring(6, 38);
                            System.out.println(hashValue);
                            FXMLLineChartController.setHash(hashValue);
                             try
                                  lineTab .setText("Line Graph (Rows Read)");
                                  lineTab.setContent(FXMLLoader.load(getClass().getResource("/javafxapplication2/FXMLLineChart.fxml")));
                                  Node aNode = (Node) e.getSource();
                                  Scene scene = aNode.getScene();
                                  thisTabPane = (TabPane) scene.lookup("#tabPane");
                                  thisTabPane.getTabs().add(lineTab);
                                  selectionModel.selectLast();
                                  //throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
                              catch ( IOException ex )
                                  Logger.getLogger(FXMLWrittenChartController.class.getName()).log(Level.SEVERE, null, ex);
    //Line Chart controller
    //Create the Graph
        @FXML
        private LineChart barChart;
    public void populateGraph ()
            System.out.println("Populate graph Line Chart");
            final CategoryAxis xAxis = new CategoryAxis();
            final NumberAxis yAxis = new NumberAxis();
            ObservableList<XYChart.Series<String, Number>> barChartData = FXCollections.observableArrayList();
            barChartData.clear();
            baseHash.clear();
            xAxis.setLabel("Query");
            yAxis.setLabel("Number of Executions");     
            series1.setName("Data from User DB2 for Query " +getHash() );
            for ( int i = 0; i < userLine.size(); i++ )
                    System.out.println(getHash() + " Usersize = " + userLine.size() + " base size " +baseLine.size());
                    series1.getData().add(new XYChart.Data<String, Number>(userLine.get(i).getBuildNumber(), (userLine.get(i).getDYN_Num_Executions())));
            barChartData.add(series1);
            barChart.setData(barChartData);

    Hi all,
    I am wondering can anybody help with this problem.
    I have an application that can create a new tab when the LineChart FXML view is called by way of onMouseClicked event from a bar graph (using scenebuilder). However, I need this Line chart to update when the user clicks a new bar on the bar graph page to show this new data.
    Initially the Line chart tab will open and display data from the first bar graph click and when I click another bar in Tab A (bar chart) if it has the same number of rows it will refresh the LineChart tab otherwise I get an error. Then if I try to load another line graph tab using a different bar graph as the source I get a child duplication error
    (So tab A has a bar graph that calls tab B to represent data as a line graph, however it wont do it more then once when there is a different number of points to show)
    (Also tab C, another Bar chart will not load a new tab) Exceptions below & Class detail below.
    I am using clear() to empty the observable list I have which is used to populate the graph and table before it reads in the new data values
    What is the proper way/ best way to dynamically add another tab and update the chart in the tab with new values? Any help would be appreciated.
    I am getting the following exceptions:
    Exception in thread "JavaFX Application Thread" java.lang.IndexOutOfBoundsException: Index: 11, Size: 7
      at java.util.ArrayList.rangeCheckForAdd(ArrayList.java:661)
      at java.util.ArrayList.add(ArrayList.java:473)
      at com.sun.javafx.collections.ObservableListWrapper.doAdd(ObservableListWrapper.java:101)
      at javafx.collections.ModifiableObservableListBase.add(ModifiableObservableListBase.java:151)
      at com.sun.javafx.collections.VetoableListDecorator.add(VetoableListDecorator.java:320)
      at com.sun.javafx.scene.control.skin.TabPaneSkin$TabHeaderArea.addTab(TabPaneSkin.java:854)
      at com.sun.javafx.scene.control.skin.TabPaneSkin$TabHeaderArea.access$500(TabPaneSkin.java:659)
      at com.sun.javafx.scene.control.skin.TabPaneSkin.addTabs(TabPaneSkin.java:276)
      at com.sun.javafx.scene.control.skin.TabPaneSkin.lambda$initializeTabListener$463(TabPaneSkin.java:357)
      at com.sun.javafx.scene.control.skin.TabPaneSkin$$Lambda$108/885312968.onChanged(Unknown Source)
      at com.sun.javafx.collections.ListListenerHelper$Generic.fireValueChangedEvent(ListListenerHelper.java:329)
      at com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(ListListenerHelper.java:73)
      at javafx.collections.ObservableListBase.fireChange(ObservableListBase.java:233)
      at javafx.collections.ListChangeBuilder.commit(ListChangeBuilder.java:482)
      at javafx.collections.ListChangeBuilder.endChange(ListChangeBuilder.java:541)
      at javafx.collections.ObservableListBase.endChange(ObservableListBase.java:205)
      at javafx.collections.ModifiableObservableListBase.add(ModifiableObservableListBase.java:155)
      at java.util.AbstractList.add(AbstractList.java:108)
      at javafxapplication2.FXMLExecutionChartController$3.handle(FXMLExecutionChartController.java:262)
      at javafxapplication2.FXMLExecutionChartController$3.handle(FXMLExecutionChartController.java:241)
      at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
      at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
      at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
      at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
      at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
      at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
      at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
      at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
      at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
      at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
      at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
      at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
      at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
      at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
      at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
      at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
      at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
      at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
      at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
      at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
      at javafx.event.Event.fireEvent(Event.java:198)
      at javafx.scene.Scene$ClickGenerator.postProcess(Scene.java:3437)
      at javafx.scene.Scene$ClickGenerator.access$7900(Scene.java:3365)
      at javafx.scene.Scene$MouseHandler.process(Scene.java:3733)
      at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3452)
      at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1728)
      at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2461)
      at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:348)
      at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:273)
      at java.security.AccessController.doPrivileged(Native Method)
      at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:382)
      at com.sun.glass.ui.View.handleMouseEvent(View.java:553)
      at com.sun.glass.ui.View.notifyMouse(View.java:925)
      at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
      at com.sun.glass.ui.win.WinApplication.lambda$null$141(WinApplication.java:102)
      at com.sun.glass.ui.win.WinApplication$$Lambda$37/1146743572.run(Unknown Source)
      at java.lang.Thread.run(Thread.java:745)
    Exception in thread "JavaFX Application Thread" java.lang.NullPointerException
      at javafxapplication2.FXMLExecutionChartController$3.handle(FXMLExecutionChartController.java:263)
      at javafxapplication2.FXMLExecutionChartController$3.handle(FXMLExecutionChartController.java:241)
      at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
      at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
      at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
      at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
      at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
      at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
      at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
      at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
      at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
      at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
      at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
      at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
      at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
      at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
      at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
      at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
      at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
      at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
      at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
      at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
      at javafx.event.Event.fireEvent(Event.java:198)
      at javafx.scene.Scene$ClickGenerator.postProcess(Scene.java:3437)
      at javafx.scene.Scene$ClickGenerator.access$7900(Scene.java:3365)
      at javafx.scene.Scene$MouseHandler.process(Scene.java:3733)
      at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3452)
      at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1728)
      at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2461)
      at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:348)
      at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:273)
      at java.security.AccessController.doPrivileged(Native Method)
      at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:382)
      at com.sun.glass.ui.View.handleMouseEvent(View.java:553)
      at com.sun.glass.ui.View.notifyMouse(View.java:925)
      at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
      at com.sun.glass.ui.win.WinApplication.lambda$null$141(WinApplication.java:102)
      at com.sun.glass.ui.win.WinApplication$$Lambda$37/1146743572.run(Unknown Source)
      at java.lang.Thread.run(Thread.java:745)
    Class Information:
    //Call to the Line chart graph
    n.setOnMouseClicked(new EventHandler<MouseEvent>()
                    @Override
                    public void handle ( MouseEvent e )
                        String s1 = dt.getXValue();
                        String s = s1.trim();
                        if ( baseHash.containsKey(s) )
                            String value = (String) baseHash.get(s);
                            String hashValue = value.substring(6, 38);
                            System.out.println(hashValue);
                            FXMLLineChartController.setHash(hashValue);
                             try
                                  lineTab .setText("Line Graph (Rows Read)");
                                  lineTab.setContent(FXMLLoader.load(getClass().getResource("/javafxapplication2/FXMLLineChart.fxml")));
                                  Node aNode = (Node) e.getSource();
                                  Scene scene = aNode.getScene();
                                  thisTabPane = (TabPane) scene.lookup("#tabPane");
                                  thisTabPane.getTabs().add(lineTab);
                                  selectionModel.selectLast();
                                  //throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
                              catch ( IOException ex )
                                  Logger.getLogger(FXMLWrittenChartController.class.getName()).log(Level.SEVERE, null, ex);
    //Line Chart controller
    //Create the Graph
        @FXML
        private LineChart barChart;
    public void populateGraph ()
            System.out.println("Populate graph Line Chart");
            final CategoryAxis xAxis = new CategoryAxis();
            final NumberAxis yAxis = new NumberAxis();
            ObservableList<XYChart.Series<String, Number>> barChartData = FXCollections.observableArrayList();
            barChartData.clear();
            baseHash.clear();
            xAxis.setLabel("Query");
            yAxis.setLabel("Number of Executions");     
            series1.setName("Data from User DB2 for Query " +getHash() );
            for ( int i = 0; i < userLine.size(); i++ )
                    System.out.println(getHash() + " Usersize = " + userLine.size() + " base size " +baseLine.size());
                    series1.getData().add(new XYChart.Data<String, Number>(userLine.get(i).getBuildNumber(), (userLine.get(i).getDYN_Num_Executions())));
            barChartData.add(series1);
            barChart.setData(barChartData);

  • How can I select multiple cells in tableview with javafx only by mouse?

    I have an application with a tableview in javafx and i want to select multiple cells only by mouse (something like the selection which exists in excel).I tried with setOnMouseDragged but i cant'n do something because the selection returns only the cell from where the selection started.Can someone help me?

    For mouse drag events to propagate to nodes other than the node in which the drag initiated, you need to activate a "full press-drag-release gesture" by calling startFullDrag(...) on the initial node. (See the Javadocs for MouseEvent and MouseDragEvent for details.) Then you can register for MouseDragEvents on the table cells in order to receive and process those events.
    Here's a simple example: the UI is not supposed to be ideal but it will give you the idea.
    import java.util.Arrays;
    import javafx.application.Application;
    import javafx.beans.property.SimpleStringProperty;
    import javafx.collections.FXCollections;
    import javafx.collections.ObservableList;
    import javafx.event.EventHandler;
    import javafx.geometry.Insets;
    import javafx.scene.Group;
    import javafx.scene.Scene;
    import javafx.scene.control.Label;
    import javafx.scene.control.SelectionMode;
    import javafx.scene.control.TableCell;
    import javafx.scene.control.TableColumn;
    import javafx.scene.control.TableView;
    import javafx.scene.control.cell.PropertyValueFactory;
    import javafx.scene.input.MouseDragEvent;
    import javafx.scene.input.MouseEvent;
    import javafx.scene.layout.VBox;
    import javafx.scene.text.Font;
    import javafx.stage.Stage;
    import javafx.util.Callback;
    public class DragSelectionTable extends Application {
        private TableView<Person> table = new TableView<Person>();
        private final ObservableList<Person> data =
            FXCollections.observableArrayList(
                new Person("Jacob", "Smith", "[email protected]"),
                new Person("Isabella", "Johnson", "[email protected]"),
                new Person("Ethan", "Williams", "[email protected]"),
                new Person("Emma", "Jones", "[email protected]"),
                new Person("Michael", "Brown", "[email protected]")
        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(450);
            stage.setHeight(500);
            final Label label = new Label("Address Book");
            label.setFont(new Font("Arial", 20));
            table.setEditable(true);
            TableColumn<Person, String> firstNameCol = new TableColumn<>("First Name");
            firstNameCol.setMinWidth(100);
            firstNameCol.setCellValueFactory(
                    new PropertyValueFactory<Person, String>("firstName"));
            TableColumn<Person, String> lastNameCol = new TableColumn<>("Last Name");
            lastNameCol.setMinWidth(100);
            lastNameCol.setCellValueFactory(
                    new PropertyValueFactory<Person, String>("lastName"));
            TableColumn<Person, String> emailCol = new TableColumn<>("Email");
            emailCol.setMinWidth(200);
            emailCol.setCellValueFactory(
                    new PropertyValueFactory<Person, String>("email"));
            final Callback<TableColumn<Person, String>, TableCell<Person, String>> cellFactory = new DragSelectionCellFactory();
            firstNameCol.setCellFactory(cellFactory);
            lastNameCol.setCellFactory(cellFactory);
            emailCol.setCellFactory(cellFactory);
            table.setItems(data);
            table.getColumns().addAll(Arrays.asList(firstNameCol, lastNameCol, emailCol));
            table.getSelectionModel().setCellSelectionEnabled(true);
            table.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
            final VBox vbox = new VBox();
            vbox.setSpacing(5);
            vbox.setPadding(new Insets(10, 0, 0, 10));
            vbox.getChildren().addAll(label, table);
            ((Group) scene.getRoot()).getChildren().addAll(vbox);
            stage.setScene(scene);
            stage.show();
        public static class DragSelectionCell extends TableCell<Person, String> {
            public DragSelectionCell() {
                setOnDragDetected(new EventHandler<MouseEvent>() {
                    @Override
                    public void handle(MouseEvent event) {
                        startFullDrag();
                        getTableColumn().getTableView().getSelectionModel().select(getIndex(), getTableColumn());
                setOnMouseDragEntered(new EventHandler<MouseDragEvent>() {
                    @Override
                    public void handle(MouseDragEvent event) {
                        getTableColumn().getTableView().getSelectionModel().select(getIndex(), getTableColumn());
            @Override
            public void updateItem(String item, boolean empty) {
                super.updateItem(item, empty);
                if (empty) {
                    setText(null);
                } else {
                    setText(item);
        public static class DragSelectionCellFactory implements Callback<TableColumn<Person, String>, TableCell<Person, String>> {
            @Override
            public TableCell<Person, String> call(final TableColumn<Person, String> col) {         
                return new DragSelectionCell();
        public static class Person {
            private final SimpleStringProperty firstName;
            private final SimpleStringProperty lastName;
            private final SimpleStringProperty email;
            private Person(String fName, String lName, String email) {
                this.firstName = new SimpleStringProperty(fName);
                this.lastName = new SimpleStringProperty(lName);
                this.email = new SimpleStringProperty(email);
            public String getFirstName() {
                return firstName.get();
            public void setFirstName(String fName) {
                firstName.set(fName);
            public String getLastName() {
                return lastName.get();
            public void setLastName(String fName) {
                lastName.set(fName);
            public String getEmail() {
                return email.get();
            public void setEmail(String fName) {
                email.set(fName);

  • Call a Web Service from JavaFX running als WebStart or embed in a Browser

    Calling a Web Service from a JavaFX running as a application all is fine.
    Wenn run the same JavaFX as WebStart or Browser embed I get a runtime exception:
    =================================
    Java-Plug-in 10.7.2.10
    JRE-Version verwenden 1.7.0_07-b10 Java HotSpot(TM) Client VM
    Benutzer-Home-Verzeichnis = C:\Users\Olaf
    c: Konsolenfenster löschen
    f: Objekte in Finalisierungs-Queue finalisieren
    g: Garbage Collect
    h: Diese Hilfemeldung anzeigen
    l: Class Loader-Liste ausgeben
    m: Speicherauslastung drucken
    o: Logging auslösen
    q: Konsole ausblenden
    r: Policy-Konfiguration neu laden
    s: System- und Deployment-Eigenschaften ausgeben
    t: Threadliste ausgeben
    v: Thread-Stack ausgeben
    x: Class Loader-Cache leeren
    0-5: Trace-Ebene auf <n> setzen
         Match: beginTraversal
    Match: digest selected JREDesc: JREDesc[version 1.6+, heap=-1--1, args=null, href=http://java.sun.com/products/autodl/j2se, sel=false, null, null], JREInfo: JREInfo for index 0:
    platform is: 1.7
    product is: 1.7.0_07
    location is: http://java.sun.com/products/autodl/j2se
    path is: C:\Program Files (x86)\Java\jre7\bin\javaw.exe
    args is:
    native platform is: Windows, x86 [ x86, 32bit ]
    JavaFX runtime is: JavaFX 2.2.0 found at C:\Program Files (x86)\Java\jre7\
    enabled is: true
    registered is: false
    system is: true
         Match: ignoring maxHeap: -1
         Match: ignoring InitHeap: -1
         Match: digesting vmargs: null
         Match: digested vmargs: [JVMParameters: isSecure: true, args: ]
         Match: JVM args after accumulation: [JVMParameters: isSecure: true, args: ]
         Match: digest LaunchDesc: file:/C:/Users/Olaf/Documents/NetBeansProjects/JavaFXApplication4/dist/JavaFXApplication4.jnlp
         Match: digest properties: []
         Match: JVM args: [JVMParameters: isSecure: true, args: ]
         Match: endTraversal ..
         Match: JVM args final:
         Match: Running JREInfo Version match: 1.7.0.07 == 1.7.0.07
         Match: Running JVM args match: have:<> satisfy want:<>
    CacheEntry[file:/C:/Users/Olaf/Documents/NetBeansProjects/JavaFXApplication4/dist/JavaFXApplication4.jar]: updateAvailable=true,lastModified=Tue Sep 04 21:16:35 CEST 2012,length=39432
    java.lang.ExceptionInInitializerError
         at com.sun.xml.internal.ws.util.xml.XmlUtil.createDefaultCatalogResolver(Unknown Source)
         at com.sun.xml.internal.ws.client.WSServiceDelegate.parseWSDL(Unknown Source)
         at com.sun.xml.internal.ws.client.WSServiceDelegate.<init>(Unknown Source)
         at com.sun.xml.internal.ws.client.WSServiceDelegate.<init>(Unknown Source)
         at com.sun.xml.internal.ws.spi.ProviderImpl.createServiceDelegate(Unknown Source)
         at javax.xml.ws.Service.<init>(Unknown Source)
         at javafxapplication4.ws.NewWebService_Service.<init>(NewWebService_Service.java:42)
         at javafxapplication4.JavaFXApplication4.start(JavaFXApplication4.java:25)
         at com.sun.javafx.applet.FXApplet2$1.run(FXApplet2.java:131)
         at com.sun.javafx.application.PlatformImpl$4.run(PlatformImpl.java:173)
         at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
         at com.sun.glass.ui.win.WinApplication.access$100(WinApplication.java:29)
         at com.sun.glass.ui.win.WinApplication$2$1.run(WinApplication.java:67)
         at java.lang.Thread.run(Unknown Source)
    Caused by: java.security.AccessControlException: access denied ("java.util.PropertyPermission" "xml.catalog.ignoreMissing" "read")
         at java.security.AccessControlContext.checkPermission(Unknown Source)
         at java.security.AccessController.checkPermission(Unknown Source)
         at java.lang.SecurityManager.checkPermission(Unknown Source)
         at java.lang.SecurityManager.checkPropertyAccess(Unknown Source)
         at java.lang.System.getProperty(Unknown Source)
         at com.sun.org.apache.xml.internal.resolver.CatalogManager.<init>(Unknown Source)
         at com.sun.org.apache.xml.internal.resolver.CatalogManager.<clinit>(Unknown Source)
         ... 14 more
    ======================================================
    Any hint for me.
    thx
    Olaf

    Sign your application.
    http://docs.oracle.com/javafx/2/deployment/deploy_overview.htm#CEGJGHDA

  • JavaFX's null not allowed is a thorn in my side....

    Hi All,
    Rule: JavaFX's data types (i.e. Number, Double, String, Integer) can't be null.
    My JavaFX Application listen's for real time data updates. Since this is a listener, it won't have a value til it get's the first update. Sounds fair enough... but they can't be null! So, I must use java.lang.Double instead. But all binding's convert the java.lang.Double null value to a javafx Double value of 0.0. So now I have broken logic in my program as 0.0 is a legitimate value and certainly does not signify 'null'. So, then it looks like I am stuck entirely with java.lang.Double everywhere! But then I'd need to do my own java.lang.Double -> fx.Double casting class/function to handle the cast conversion of each binding in order to interact sensibly with the JavaFX API (as it like's the FX Double everywhere and won't throw a nullpointer exception when casting).
    Rule: JavaFX's sequences can't contain null entries.
    Further more, I could say "Nope, I don't have a value/update yet so I will just use an object placeholder/wrapper with null assignment". In my case, JavaFX object's are multiple and ordered. Perfect for a sequence! Except, you can't store null in a sequence! Thus, if you are looking for a team's sport's top batsman.. the 3rd batsman and they don't exist yet.. then 'team[2] = null' wont insert! So how can I find and bind to the 3rd batsman? We'll either I avoid sequences, which means native array's or java collections... but then I can't really bind to them! Or, everytime the sequence changes I need to search/iterate over the entire sequence to determine if there is a 3rd batsman in the sequence (and that won't necessarily be the 3rd entry).
    Both these 'null not allowed' rules cause significant problems and have huge flow on effects onto the code that uses them. I believe this is totally wrong and a bad feature of the language and completely contradicts autoboxing! The identification of a data type reference being null is extremely significant. It is the responsibility of the receiver of a null reference/argument to decided how they want to handle the null reference (see autoboxing nullpointer exceptions if you don't believe me and reasons not to use java primitives). Removing the ability for this to occur is a step backwards for functional programming. I know you will say that I could just use the java.lang.*, a fair claim... but don't forget this means more work! The very reason you might be considering JavaFX in the first place.
    Anyway my rant is over, I really love JavaFX.... just not these x2 rules.

    The technique PhiLho refers to is often called the "null object pattern". If done properly it needn't be hackish at all, and indeed it can simplify a lot of processing code. Even if the "primitive" values (Number, String, etc.) could be null, and even if you could put nulls into a sequence, you're probably better off putting in an actual object that represents the absence of a value. The reason is that when you go to process that data, instead of just processing it, you have to put in checks for nulls here and there, and do special-case processing for it.
    Consider displaying a list of, say, the top five batsmen. You'll want to have a sequence of five batsmen, and you'll want to put five CustomNodes or something into a VBox to display the names, statistics, etc., something like the following:
    VBox {
        content: [
            for (b in [0..<5]) {
                BatsmanNode {
                    name: bind batsmen.name
    innings: bind batsmen[i].innings
    notOuts: bind batsmen[i].notOuts
    visible: bind batsmen[i].valid
    You can't do this if there were a null in the sequence, even if it were allowed. Instead, you should put a "fake" batsman object into the sequence, and make its "valid" variable be false. This way the corresponding BatsmanNode will be invisible. Or, you could have it display "(no entry)" in grey text, or something like that.
    The point is that if you always have a real object there, even if it represents a "null" or the absence of a value, it removes special-case processing code and enables you to do things like bind to it.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           

  • How to use List within javaFX(*.fx) script?

    How to use java.util.List within javaFX(*.fx) script?
    The following is my code in Java
    PDBFileReader pdbreader = new PDBFileReader();
              pdbreader.setPath("/Path/To/PDBFiles/");
              pdbreader.setParseSecStruc(true);// parse the secondary structure information from PDB file
              pdbreader.setAlignSeqRes(true);  // align SEQRES and ATOM records
              pdbreader.setAutoFetch(true);    // fetch PDB files from web if they can't be found locally
              try{
                   Structure struc = pdbreader.getStructureById(code);
                   System.out.println("The SEQRES and ATOM information is available via the chains:");
                   int modelnr = 0 ; // also is 0 if structure is an XRAY structure.
                   List<Chain> chains = struc.getChains(modelnr);
                   for (Chain cha:chains){
                        List<Group> agr = cha.getAtomGroups("amino");
                        List<Group> hgr = cha.getAtomGroups("hetatm");
                        List<Group> ngr = cha.getAtomGroups("nucleotide");
                        System.out.print("chain: >"+cha.getName()+"<");
                        System.out.print(" length SEQRES: " +cha.getLengthSeqRes());
                        System.out.print(" length ATOM: " +cha.getAtomLength());
                        System.out.print(" aminos: " +agr.size());
                        System.out.print(" hetatms: "+hgr.size());
                        System.out.println(" nucleotides: "+ngr.size()); 
              } catch (Exception e) {
                   e.printStackTrace();
              }The following is my code in JavaFX(getting errors)
    var loadbtn:SwingButton = SwingButton{
        text:"Load"
        action: function():Void{
            var pdbreader = new PDBFileReader();
            var structure = null;
            try{
                structure = pdbreader.getStructure(filepath.text);
                List<Chain> chains = structure.getChains(0);
                foreach (Chain cha in chains){
                        List < Group > agr = cha.getAtomGroups("amino");
                        List < Group > hgr = cha.getAtomGroups("hetatm");
                        List < Group > ngr = cha.getAtomGroups("nucleotide");
            } catch (e:IOException) {
                e.printStackTrace();
        };I'm using Netbeans 6.5 with JavaFX
    (PDBFileReader, Chain, Structure etc are classes from my own package, already added to the library folder under the project directory)
    Simply put, How to use List and Foreach in JavaFX?

    We can not use Java Generics syntax in JavaFX. But we can use Java Collection classes using the keyword 'as' for type-casting.
    e.g.
    import java.util.LinkedList;
    import java.util.List;
    import javafx.scene.shape.Rectangle;
    var outerlist : List = new LinkedList();
    var innerlist : List = new LinkedList();
    innerlist.add(Rectangle{
        width: 10 height:10});
    innerlist.add(Rectangle{
        width: 20 height:20});
    outerlist.add(innerlist);
    for (inner in outerlist) {
        var list : List = inner as List;
        for (element in list) {
            var rect : Rectangle = element as Rectangle;
            println("(width, height)=({rect.width}, {rect.height})");
    }

  • TableView.edit() is not working in JavaFX 2.1

    Hi All,
    Yesterday i have updated my javafx installation from JavaFX 2.0.2 to JavaFX 2.1 b07
    After that I am facing issues with TableView.edit() method. It stops working and not making the cell as editable.
    In the below example , select the first cell, and on click of 'tab' , the next cell is changed to editing state..and goes on for all the cells. If it reaches the end column, the first cell of the next row is selected.
    You can find the sscce example below. The same code is working well in 2.0.2 build.
    import javafx.application.Application;
    import javafx.beans.property.SimpleStringProperty;
    import javafx.beans.value.ChangeListener;
    import javafx.beans.value.ObservableValue;
    import javafx.collections.FXCollections;
    import javafx.collections.ObservableList;
    import javafx.event.EventHandler;
    import javafx.scene.Node;
    import javafx.scene.Scene;
    import javafx.scene.control.Label;
    import javafx.scene.control.TableCell;
    import javafx.scene.control.TableColumn;
    import javafx.scene.control.TableView;
    import javafx.scene.control.TextField;
    import javafx.scene.control.cell.PropertyValueFactory;
    import javafx.scene.input.KeyCode;
    import javafx.scene.input.KeyEvent;
    import javafx.scene.input.MouseEvent;
    import javafx.scene.layout.StackPane;
    import javafx.stage.Stage;
    import javafx.util.Callback;
    import com.sun.javafx.scene.control.skin.TableRowSkin;
    public class StartEditDemo extends Application {
        public static void main(String[] args) {
            Application.launch(args);
        public void start(Stage primaryStage) {
            primaryStage.setTitle("Start Edit Test");
            StackPane root = new StackPane();
            Scene scene = new Scene(root, 600, 150);
            primaryStage.setScene(scene);
            primaryStage.show();
            configureTable(root);
         private void configureTable(StackPane root) {
              final ObservableList<MyDomain> data = FXCollections.observableArrayList(
                         new MyDomain("Apple","This is a fruit","Red"),
                         new MyDomain("PineApple","This is also a fruit","Yellow"),
                         new MyDomain("Potato","This is a vegetable","Brown")
              TableView<MyDomain> table = new TableView<MyDomain>();
              TableColumn<MyDomain,String> titleColumn = new TableColumn<MyDomain,String>("Name");
              titleColumn.setPrefWidth(150);
              titleColumn.setCellValueFactory(new PropertyValueFactory<MyDomain,String>("name"));
              titleColumn.setCellFactory(getEditableCallBack(1));
              TableColumn<MyDomain,String> descCol = new TableColumn<MyDomain,String>("Description");
              descCol.setPrefWidth(150);
              descCol.setCellValueFactory(new PropertyValueFactory<MyDomain,String>("description"));
              descCol.setCellFactory(getEditableCallBack(2));
              TableColumn<MyDomain,String> colorCol = new TableColumn<MyDomain,String>("Color");
              colorCol.setPrefWidth(150);
              colorCol.setCellValueFactory(new PropertyValueFactory<MyDomain,String>("color"));
              colorCol.setCellFactory(getEditableCallBack(0));
              table.getColumns().addAll(titleColumn,descCol,colorCol);
              table.setItems(data);
              root.getChildren().add(table);
         private Callback<TableColumn<MyDomain, String>, TableCell<MyDomain, String>> getEditableCallBack(final int nextColumn) {
              /* Cell factory call back object */
              return new Callback<TableColumn<MyDomain, String>, TableCell<MyDomain, String>>() {
                   @Override
                   public TableCell<MyDomain, String> call(TableColumn<MyDomain, String> p) {
                        return new EditableCell<MyDomain>(nextColumn);
         public class EditableCell<T> extends TableCell<T, String> {
              private TextField textBox;
              private Label label;
              private int nextCol;
              public EditableCell(int nextcolumn) {
                   this.label = new Label();
                   this.nextCol = nextcolumn;
                   /* Enabling to get the edit cell on single mouse click over the cell. */
                   this.setOnMouseClicked(new EventHandler<MouseEvent>() {
                        @Override
                        public void handle(MouseEvent event) {
                             startEdit();
              @Override
              public void startEdit() {
                   super.startEdit();
                   if (isEmpty()) {
                        return;
                   if (textBox == null) {
                        createTextBox();
                   } else {
                        textBox.setText(getItem());
                   setGraphic(textBox);
                   textBox.requestFocus();
                   textBox.selectAll();
                   setEditable(true);
              @Override
              public void updateItem(String item, boolean empty) {
                   super.updateItem(item, empty);
                   if (!isEmpty()) {
                        if (textBox != null) {
                             textBox.setText(item);
                        label.setText(item);
                        setGraphic(label);
              private void createTextBox() {
                   textBox = new TextField(getItem());
                   /* On focus of the textbox, selecting the row.*/
                   textBox.focusedProperty().addListener(new ChangeListener<Boolean>() {
                        @Override
                        public void changed(ObservableValue<? extends Boolean> paramObservableValue,Boolean paramT1, Boolean paramT2) {
                             if(paramT2){
                                  EditableCell.this.getTableView().getSelectionModel().select(EditableCell.this.getIndex());
                   textBox.setOnKeyReleased(new EventHandler<KeyEvent>() {
                        @Override
                        public void handle(KeyEvent t) {
                             if (t.getCode() == KeyCode.ENTER) {
                                  callAction();
                             } else if (t.getCode() == KeyCode.ESCAPE) {
                                  cancelEdit();
                   textBox.setOnKeyPressed(new EventHandler<KeyEvent>() {
                        @Override
                        public void handle(KeyEvent t) {
                             if (t.getCode() == KeyCode.TAB){
                                  if(nextCol!=0){
                                       // Making the next as editable and focused.
                                       TableColumn nextColumn = getTableView().getColumns().get(nextCol);
                                       getTableView().edit(getTableRow().getIndex(), nextColumn);
                                       getTableView().getFocusModel().focus(getTableRow().getIndex(), nextColumn);
                                  }else{
                                       // Making the next row as editable.
                                       if(getTableRow().getIndex()<getTableView().getItems().size()){
                                            TableColumn nextColumn = getTableView().getColumns().get(0);
                                            getTableView().edit(getTableRow().getIndex()+1, nextColumn);
                                            getTableView().getFocusModel().focus(getTableRow().getIndex()+1, nextColumn);
              @Override
              public void cancelEdit() {
                   super.cancelEdit();
                   textBox = null;
                   setGraphic(label);
              @Override
              public void commitEdit(String t) {
                   super.commitEdit(t);
                   setItem(t);
                   textBox = null;
                   label.setText(t);
                   setGraphic(label);
              @SuppressWarnings("rawtypes")
              public ObservableList<Node> getAllCellsOfSameRow(TableCell cell) {
                   TableRowSkin rowSkin = (TableRowSkin) cell.getParent();
                   return rowSkin.getChildren();
              public void callAction() {
                   TableRowSkin<T> rowSkin = (TableRowSkin<T>) this.getParent();
                   ObservableList<Node> cells = rowSkin.getChildren();
                   for (Node node : cells) {
                        EditableCell<T> cell = (EditableCell<T>) node;
                        cell.commitEdit(cell.getTextBox().getText());
              public TextField getTextBox() {
                   return this.textBox;
              public Label getLabel() {
                   return this.label;
         public class MyDomain{
              private SimpleStringProperty name = new SimpleStringProperty();
              private SimpleStringProperty description = new SimpleStringProperty();
              private SimpleStringProperty color = new SimpleStringProperty();
              public MyDomain(String name, String desc, String color){
                   this.name.set(name);
                   this.description.set(desc);
                   this.color.set(color);
              public String getDescription() {
                 return description.get();
              public SimpleStringProperty descriptionProperty(){
                  return description;
             public String getName() {
                 return name.get();
             public SimpleStringProperty nameProperty(){
                  return name;
             public String getColor() {
                 return color.get();
             public SimpleStringProperty colorProperty(){
                  return color;
    }Regards,
    Sai Pradeep Dandem.

    As jsmith notes, the best place to report bugs is directly into the Jira tracker at http://javafx-jira.kenai.com. If you put it in the 'runtime' area against the 'controls' component, it'll end up on my plate.
    Thanks!
    Jonathan

  • What's the purpose of javafx.util.Pair K, V ?

    Hi,
    what's the purpose of javafx.util.Pair<K, V> if we can just use java.util.AbstractMap.SimpleEntry<K, V> for the same use cases?

    You are seriously asking why you should use a proper API-class over a static inner class of some random collection class?

  • Drag and Drop objects with JavaFX properties

    Has anyone tried to implement drag and drop functionality with objects containing JavaFX properties? The issue I'm running into is that the objects appear to need to be serializable, and the JavaFX properties are not serializable. I can implement Externalizable instead of Serializable, and basically serialize the values contained by the FX properties, but of course I lose any bindings by doing this (as the listeners underlying the bindings are not serialized).
    The [url http://docs.oracle.com/javafx/2/api/javafx/scene/input/Clipboard.html]javadocs for Clipboard state "In addition to the common or built in types, you may put any arbitrary data onto the clipboard (assuming it is either a reference, or serializable. See more about references later)" but I don't see any further information about references (and at any rate, this doesn't really make sense since anything that's serializable would be a reference anyway). Is there a special DataFormat I can use to specify a reference in the local JVM so the reference gets passed without serialization?
    I know this might not make sense without a code example; I just thought someone might have come across this closely enough to recognize the problem. I'll try to post a code example tonight...

    Here's pretty much the simplest example I can come up with. I have a real-world example of needing to do this, but the object model for the real example is quite a bit more complex.
    For the toy example, imagine we have a list of projects, some employees, and we want to assign each project to one or more employees. I have a Project class with a title and assignee. (In real life you can imagine other properties; due date, status, etc.) I'll keep a ListView with a bunch of unassigned projects (titles but assignees equal to null) and then a ListView for each of the employees.
    To assign a project to an employee, the user should be able to drag from the "master" list view to one of the employee list views. When the project is dropped, we'll create a new project, set the assignee, and bind the title of the new project to the title of the project which was dragged. (Remember we want to be able to assign a single project to multiple employees.)
    So here's the first shot:
    A couple of simple model classes
    Project.java
    import java.io.Externalizable;
    import java.io.IOException;
    import java.io.ObjectInput;
    import java.io.ObjectOutput;
    import javafx.beans.property.ObjectProperty;
    import javafx.beans.property.SimpleObjectProperty;
    import javafx.beans.property.SimpleStringProperty;
    import javafx.beans.property.StringProperty;
    public class Project {
         private final StringProperty title ;
         private final ObjectProperty<Employee> assignee ;
         public Project(String title) {
              this.title = new SimpleStringProperty(this, "title", title);
              this.assignee = new SimpleObjectProperty<Employee>(this, "assignee");
         public Project() {
              this("");
         public StringProperty titleProperty() {
              return title ;
         public String getTitle() {
              return title.get() ;
         public void setTitle(String title) {
              this.title.set(title);
         public ObjectProperty<Employee> assigneeProperty() {
              return assignee ;
         public Employee getAssignee() {
              return assignee.get();
         public void setAssignee(Employee assignee) {
              this.assignee.set(assignee);
         @Override
         public String toString() {
              String t = title.get();
              Employee emp = assignee.get();
              if (emp==null) {
                   return t;
              } else {
                   return String.format("%s (%s)", t, emp.getName()) ;
    }Employee.java
    import java.io.Externalizable;
    import java.io.IOException;
    import java.io.ObjectInput;
    import java.io.ObjectOutput;
    import javafx.beans.property.SimpleStringProperty;
    import javafx.beans.property.StringProperty;
    public class Employee {
         private StringProperty name ;
         public Employee(String name) {
              this.name = new SimpleStringProperty(this,"name", name);
         public StringProperty nameProperty() {
              return name ;
         public String getName() {
              return name.get();
         public void setName(String name) {
              this.name.set(name);
    }and the application
    DnDExample.java
    import javafx.application.Application;
    import javafx.beans.value.ChangeListener;
    import javafx.beans.value.ObservableValue;
    import javafx.collections.ObservableList;
    import javafx.event.EventHandler;
    import javafx.scene.Scene;
    import javafx.scene.control.Label;
    import javafx.scene.control.ListCell;
    import javafx.scene.control.ListView;
    import javafx.scene.control.TextField;
    import javafx.scene.input.ClipboardContent;
    import javafx.scene.input.DataFormat;
    import javafx.scene.input.DragEvent;
    import javafx.scene.input.Dragboard;
    import javafx.scene.input.MouseEvent;
    import javafx.scene.input.TransferMode;
    import javafx.scene.layout.HBox;
    import javafx.scene.layout.VBox;
    import javafx.stage.Stage;
    import javafx.util.Callback;
    public class DnDExample extends Application {
         private static final DataFormat PROJECT_DATA_FORMAT = new DataFormat("com.example.project"); // is there something special I can use here?
         @Override
         public void start(Stage primaryStage) {
              final HBox root = new HBox(5);
              final ListView<Project> allProjects = new ListView<Project>();
              final Employee fred = new Employee("Fred");
              final Employee ginger = new Employee("Ginger");
              final ListView<Project> fredsProjects = new ListView<Project>();
              final ListView<Project> gingersProjects = new ListView<Project>();
              final VBox employeeLists = new VBox(5);
              employeeLists.getChildren().addAll(new Label("Fred's Projects"), fredsProjects, new Label("Ginger's Projects"), gingersProjects);
              root.getChildren().addAll(allProjects, employeeLists);
              allProjects.setCellFactory(new Callback<ListView<Project>, ListCell<Project>>() {
                   @Override
                   public ListCell<Project> call(ListView<Project> listView) {
                        return new AllProjectListCell();
              allProjects.setEditable(true);
              final EventHandler<DragEvent> dragOverHandler = new EventHandler<DragEvent>() {
                   @Override
                   public void handle(DragEvent dragEvent) {
                        if (dragEvent.getDragboard().hasContent(PROJECT_DATA_FORMAT)) {
                             dragEvent.acceptTransferModes(TransferMode.COPY);
              fredsProjects.setOnDragOver(dragOverHandler);
              gingersProjects.setOnDragOver(dragOverHandler);
              fredsProjects.setOnDragDropped(new DragDropHandler(fred, fredsProjects.getItems()));
              gingersProjects.setOnDragDropped(new DragDropHandler(ginger, gingersProjects.getItems()));
              allProjects.getItems().addAll(new Project("Implement Drag and Drop"), new Project("Fix serialization problem"));
              Scene scene = new Scene(root, 600, 400);
              primaryStage.setScene(scene);
              primaryStage.show();
         public static void main(String[] args) {
              launch(args);
         private class DragDropHandler implements EventHandler<DragEvent> {
              private final Employee employee ;
              private final ObservableList<Project> itemList;
              DragDropHandler(Employee employee, ObservableList<Project> itemList) {
                   this.employee = employee ;
                   this.itemList = itemList ;
              @Override
              public void handle(DragEvent event) {
                   Dragboard db = event.getDragboard();
                   if (db.hasContent(PROJECT_DATA_FORMAT)) {
                        Project project = (Project) db.getContent(PROJECT_DATA_FORMAT);
                        Project assignedProject = new Project();
                        assignedProject.titleProperty().bind(project.titleProperty());
                        assignedProject.setAssignee(employee);
                        itemList.add(assignedProject);
         private class AllProjectListCell extends ListCell<Project> {
              private TextField textField ;
              private final EventHandler<MouseEvent> dragDetectedHandler ;
              AllProjectListCell() {               
                   this.dragDetectedHandler = new EventHandler<MouseEvent>() {
                        @Override
                        public void handle(MouseEvent event) {
                             Dragboard db = startDragAndDrop(TransferMode.COPY);
                             ClipboardContent cc = new ClipboardContent();
                             cc.put(PROJECT_DATA_FORMAT, getItem());
                             db.setContent(cc);
                             event.consume();
                   this.setEditable(true);
              @Override
              public void updateItem(final Project project, boolean empty) {
                   super.updateItem(project, empty);
                   if (empty) {
                        setText(null);
                        setGraphic(null);
                        setOnDragDetected(null);
                   } else if (isEditing()) {
                        if (textField != null) {
                             textField.setText(getItem().getTitle());
                        setText(null) ;
                        setOnDragDetected(null);
                        setGraphic(textField);                    
                   } else {
                        setText(project.getTitle());
                        setOnDragDetected(dragDetectedHandler);
              @Override
              public void startEdit() {
                   super.startEdit();
                   if (!isEmpty()) {
                        textField = new TextField(getItem().getTitle());
                        textField.setMinWidth(this.getWidth()-this.getGraphicTextGap());
                        textField.focusedProperty().addListener(new ChangeListener<Boolean>() {
                             @Override
                             public void changed(
                                       ObservableValue<? extends Boolean> observable,
                                       Boolean oldValue, Boolean newValue) {
                                  if (! newValue) {
                                       getItem().setTitle(textField.getText());
                                       commitEdit(getItem());
                        setText(null);
                        setGraphic(textField);
                        setOnDragDetected(null);
              @Override
              public void cancelEdit() {
                   super.cancelEdit();
                   if (!isEmpty()) {
                        setText(getItem().getTitle());
                        setGraphic(null);
                        setOnDragDetected(dragDetectedHandler);
                   } else {
                        setText(null);
                        setGraphic(null);
                        setOnDragDetected(null);
              @Override
              public void commitEdit(Project project) {
                   super.commitEdit(project);
                   if (!isEmpty()) {
                        setText(getItem().getTitle());
                        setGraphic(null);
                        setOnDragDetected(dragDetectedHandler);
    }If you try to drag from the list on the left to one of the lists on the right, it will fail pretty quickly and tell you that the data need to be Serializable.
    Simply adding "implements Serializable" to the Project and Employee classes doesn't work, as you find that SimpleStringProperty and SimpleObjectProperty are not Serializable. So instead I can use Externalizable:
    public class Project implements Externalizable {
    @Override
         public void writeExternal(ObjectOutput out) throws IOException {
              out.writeObject(title.get());
              out.writeObject(assignee.get());
         @Override
         public void readExternal(ObjectInput in) throws IOException,
                   ClassNotFoundException {
              setTitle((String)in.readObject());
              setAssignee((Employee)in.readObject());
    }and
    public class Employee implements Externalizable {
         @Override
         public void writeExternal(ObjectOutput out) throws IOException {
              out.writeObject(name.get());
         @Override
         public void readExternal(ObjectInput in) throws IOException,
                   ClassNotFoundException {
              setName((String) in.readObject());
    }This makes the drag and drop work, but if you drop a project on one of the employee lists, then edit the project title in the master list, the binding is not respected. This is because deserialization creates a new SimpleStringProperty for the title, which is not the property to which the title of the new Project object is bound.
    What I really want to do is to be able to drag and drop an object within the same JVM simply by passing the object by reference, rather than by serializing it. Is there a way to do this? Is there some DataFormat type I need?

  • Performance problem due to garbage collection?

    Hallo,
    we implemented a digital whiteboard with JavaFX: there is a scene (3200 x 2400 px) on which you can draw (insert paths) and add post-its (colored rectangles with paths or string a content). It's possible to drag the post-its around and it's also possible to pan the scene (to reach all parts of the scene which don't fit into the windows).
    The application works quite fast even with ca. 50 post-its and lots of skribbles/drawings. But after ca. 20 minutes the application gets a lot slower. Drawing curves (or handwriting) is not really possible anymore as the paths get angular and moving a post-it takes longer and longer.
    How is this possible? Is there a problem with the JavaFX garbage collection? Does anyone else have the problem that the application gets slower after a while?
    When I close the window and load it again with the same elements it's as quick as in the beginning and slows down after ca. 20 min. again.
    Thanks for your help and suggestions what could be the problem!
    Raja

    I can't really answer...
    We can eliminate saturation of scenegraph capabilities since you can reload it again without problem (at start).
    Maybe you create lot of temp objects that aren't properly collected?
    I suggest to run JVisualVM on your application and watch its memory (and CPU) usage.

  • JavaFX: TableView's cellvalue is not enough to display in columns, I want..

    javaFX: TableView's cellvalue is not enough to display in columns, it will be clipped end of '...', how to show a tip on such cell?
    I need a tip because sometimes i can't drag the colunm's head. So i can't see the whole content of the cell.

    Create a custom cell and overwrite the updateItem method. Add a tooltip:
                       Tooltip tip = new Tooltip(getString());
                       Tooltip.install(this, tip);
                  Here is an example ( a tooltip for the email column) :
    import javafx.application.Application;
    import javafx.event.ActionEvent;
    import javafx.event.EventHandler;
    import javafx.scene.Scene;
    import javafx.scene.control.Button;
    import javafx.scene.layout.StackPane;
    import javafx.stage.Stage;
    import javafx.application.Application;
    import javafx.beans.property.SimpleStringProperty;
    import javafx.beans.value.ChangeListener;
    import javafx.beans.value.ObservableValue;
    import javafx.collections.FXCollections;
    import javafx.collections.ObservableList;
    import javafx.event.ActionEvent;
    import javafx.event.EventHandler;
    import javafx.geometry.Insets;
    import javafx.scene.Group;
    import javafx.scene.Scene;
    import javafx.scene.control.Button;
    import javafx.scene.control.Label;
    import javafx.scene.control.TableCell;
    import javafx.scene.control.TableColumn;
    import javafx.scene.control.TableColumn.CellEditEvent;
    import javafx.scene.control.TableView;
    import javafx.scene.control.TextField;
    import javafx.scene.control.Tooltip;
    import javafx.scene.control.cell.PropertyValueFactory;
    import javafx.scene.layout.HBox;
    import javafx.scene.layout.VBox;
    import javafx.scene.text.Font;
    import javafx.stage.Stage;
    import javafx.util.Callback;
    public class TableViewToolTipSample extends Application {
        private TableView<Person> table = new TableView<Person>();
        private final ObservableList<Person> data =
                FXCollections.observableArrayList(
                new Person("Jacob", "Smith", "[email protected]"),
                new Person("Isabella", "Johnson", "[email protected]"),
                new Person("Ethan", "Williams", "[email protected]"),
                new Person("Emma", "Jones", "[email protected]"),
                new Person("Michael", "Brown", "[email protected]"));
        final HBox hb = new HBox();
        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(450);
            stage.setHeight(550);
            final Label label = new Label("Address Book");
            label.setFont(new Font("Arial", 20));
            table.setEditable(true);
            Callback<TableColumn, TableCell> cellFactory =
                    new Callback<TableColumn, TableCell>() {
                        public TableCell call(TableColumn p) {
                            return new CustomCell();
            TableColumn firstNameCol = new TableColumn("First Name");
            firstNameCol.setMinWidth(100);
            firstNameCol.setCellValueFactory(
                    new PropertyValueFactory<Person, String>("firstName"));
           // firstNameCol.setCellFactory(cellFactory);
            TableColumn lastNameCol = new TableColumn("Last Name");
            lastNameCol.setMinWidth(100);
            lastNameCol.setCellValueFactory(
                    new PropertyValueFactory<Person, String>("lastName"));
          //  lastNameCol.setCellFactory(cellFactory);
            TableColumn emailCol = new TableColumn("Email");
            emailCol.setMinWidth(200);
            emailCol.setCellValueFactory(
                    new PropertyValueFactory<Person, String>("email"));
            emailCol.setCellFactory(cellFactory);
            table.setItems(data);
            table.getColumns().addAll(firstNameCol, lastNameCol, emailCol);
            final VBox vbox = new VBox();
            vbox.setSpacing(5);
            vbox.setPadding(new Insets(10, 0, 0, 10));
            vbox.getChildren().addAll(label, table, hb);
            ((Group) scene.getRoot()).getChildren().addAll(vbox);
            stage.setScene(scene);
            stage.show();
        public static class Person {
            private final SimpleStringProperty firstName;
            private final SimpleStringProperty lastName;
            private final SimpleStringProperty email;
            private Person(String fName, String lName, String email) {
                this.firstName = new SimpleStringProperty(fName);
                this.lastName = new SimpleStringProperty(lName);
                this.email = new SimpleStringProperty(email);
            public String getFirstName() {
                return firstName.get();
            public void setFirstName(String fName) {
                firstName.set(fName);
            public String getLastName() {
                return lastName.get();
            public void setLastName(String fName) {
                lastName.set(fName);
            public String getEmail() {
                return email.get();
            public void setEmail(String fName) {
                email.set(fName);
        class CustomCell extends TableCell<Person, String> {
            private TextField textField;
            public CustomCell() {
            @Override
            public void updateItem(String item, boolean empty) {
                super.updateItem(item, empty);
                if (empty) {
                    setText(null);
                    setGraphic(null);
                } else {
                    if (isEditing()) {
                        if (textField != null) {
                            textField.setText(getString());
                        setText(null);
                        setGraphic(textField);
                    } else {
                        setText(getString());
                        setGraphic(null);
                        Tooltip tip = new Tooltip(getString());
                        Tooltip.install(this, tip);
            private String getString() {
                return getItem() == null ? "" : getItem().toString();
    }If you need a tooltip for a column header:
            TableColumn emailCol = new TableColumn();
            Label emailHeaderLabel = new Label("Email header label");
            emailCol.setGraphic(emailHeaderLabel);    
            Tooltip tip = new Tooltip("Email header label");
            Tooltip.install(emailHeaderLabel, tip);Edited: added a tooltip for a column header

  • Conversion of Java Generics to JavaFX sequence in Java Program

    I have created a TwitterFetcher.java which collects the latest 20 tweets and generates a List<TwitterUpdate>
    I know that I have to convert this Java List into a JavaFX Sequence using Sequences.
    Have tried quite a few variations with Sequences.make(...) but to no avail.
    following is the code:
    import com.sun.javafx.runtime.sequence.Sequence;
    import com.sun.javafx.runtime.sequence.Sequences;
    import java.util.Iterator;
    import org.w3c.dom.TypeInfo;...
    List<TwitterUpdate> ltu = new ArrayList<TwitterUpdate>();
    TwitterUpdate tu = new TwitterUpdate();
    Sequence<? extends TwitterUpdate> stu;
    public Sequence<TwitterUpdate> getUpdates()
    for (Status status : api.getFriendsTimeline())
    tu.setName(status.getUser().getName());
    tu.setScreenName(status.getUser().getScreenName());
    tu.setImgURL(status.getUser().getProfileImageUrl());
    tu.setTweet(status.getText());
    tu.setDate(status.getCreatedAt().toDate().toString());
    ltu.add(tu);    
    //convert the List to a Sequence
    //return the sequenceAm I missing a step or two or doing something completed wrong.??
    I really have to get this done..

    We are actually following MVC architecture, where in our back end is totally in Java and the rendering is handled in JavaFX..
    Hence interop between the two was extremely important..
    and the problem was that...
    in our JavaFX project...we have packages with only java files and other packages with only JavaFX package..
    So whilst importing packages in a JavaFX classes..we can recognize our own java and javafx files...
    But whilst in Java classes..recognition of Javafx packages is not possible....
    Hence sharing Data structures between the two was difficult...
    So we ended up making POJOs..and ported that in JavaFX classes as it was able to recognize Java objects...
    We are now using concept of Array of objects and passing it to JavaFX classes as return type..
    Regards
    Kaustubh

  • Compiling JavaFX and Java into a single JAR

    Perhaps I am missing something, but is there a simple way to compile both Java and JavaFX sources into a single JAR? The issue is cross references between Java and JavaFX. Using javac or javafxc separately, cross references are handled by the compiler. But as far as I can tell, there is no compiler that compiles both Java and JavaFX sources, so that nifty solution is not available. The only solution I know of (which is not simple) is to break the sources into separate collections that can be compiled separately and in the right order before building the combined JAR that I really want.

    I've noticed my application has a JAD and a JAR, the JAD being much smaller. When I run the JAD a mobile emulator pops up, but it's not the same one I see when I debug. Also, pressing 'launch' does nothing.
    I don't know if this is related to this original post, but how does one merge the JAD and JAR?
    It seems like the emulator that comes up is related to the Mobile Toolkit. If I wanted someone to review my mobile application, what would they need to actually run this thing?

Maybe you are looking for