Giter Club home page Giter Club logo

vworkflows's Introduction

VWorkflows

Build Status


Interactive flow/graph visualization for building domain specific visual programming environments. Provides UI bindings for JavaFX.

See http://mihosoft.eu/?p=523 and http://mihosoft.eu/?p=564 for an introduction.

Join the Developer Group if you'd like to contribute.

Maven Coordinates

VWorkflows-Core:

Javadocs

<dependency>
  <groupId>eu.mihosoft.vrl.workflow</groupId>
  <artifactId>vworkflows-core</artifactId>
  <version>0.2.3</version>
</dependency>

VWorkflows-FX:

Javadocs

Replace version with the desired version (see above for latest version).

<dependency>
  <groupId>eu.mihosoft.vrl.workflow</groupId>
  <artifactId>vworkflows-fx</artifactId>
  <version>0.2.3</version>
</dependency>

How To Build

Reqirements

  • Java >= 1.8.0_60
  • Internet connection (other dependencies are downloaded automatically)
  • IDE: Gradle Plugin (not necessary for command line usage)

IDE

Open the VWorkflows Gradle project in your favourite IDE (tested with IntelliJ 2021) and build it by calling the assemble task.

Command Line

Navigate to the Gradle project (e.g., path/to/VWorkflows) and enter the following command

Bash (Linux/OS X/Cygwin/other Unix-like OS)

./gradlew assemble

Windows (CMD)

gradlew assemble

Test It

Besides the tests defined in VWorkflows-Core (test task) it is also possible to run a graphical demo that comes with VWorkflows-Demo subproject. To run it call the run task.

vworkflows's People

Contributors

aalmiray avatar davidb avatar hkarim avatar jeffreyguenther avatar miho avatar willcohen avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

vworkflows's Issues

Loading project from XML issue

Hello Michael,

Lawrence here... So... In order to make the issue better understood i've took your first tutorial and just added a "SAVE" button to call saveToXML(Path p, VFlowModel flow) method, then adeded a button "load" to call loadFromXML(Path p).

Steps to reproduce:

  1. Run the App class.
  2. Save the flow by clicking save button.
  3. Load the flow by clicking load button. (optional here close the nodes before).

Expected Result:
The flow is created.

Actual Result:
NullPointerException occurs.

Here is the code:

import java.io.IOException;
import java.nio.file.Paths;

import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.stage.Stage;
import eu.mihosoft.vrl.workflow.FlowFactory;
import eu.mihosoft.vrl.workflow.VFlow;
import eu.mihosoft.vrl.workflow.VNode;
import eu.mihosoft.vrl.workflow.fx.FXSkinFactory;
import eu.mihosoft.vrl.workflow.io.WorkflowIO;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.input.MouseEvent;
import jfxtras.labs.scene.layout.ScalableContentPane;

/**
*

  • @author Michael Hoffer [email protected]
    */
    public class App extends Application {

    /**

    • The main() method is ignored in correctly deployed JavaFX application.
    • main() serves only as fallback in case the application can not be
    • launched through deployment artifacts, e.g., in IDEs with limited FX
    • support. NetBeans ignores main().
      *
    • @param args the command line arguments
      */
      public static void main(String[] args) {
      launch(args);
      }

    @OverRide
    public void start(Stage primaryStage) {

    // create scalable root pane
    ScalableContentPane canvas = new ScalableContentPane();
    
    // define background style
    canvas.setStyle("-fx-background-color: linear-gradient(to bottom, rgb(10,32,60), rgb(42,52,120));");
    
    // create a new flow object
    
    VFlow flow = FlowFactory.newFlow();
    
    // make it visible
    flow.setVisible(true);
    
    // add two nodes to the flow
    VNode n1 = flow.newNode();
    VNode n2 = flow.newNode();
    
    // specify input & output capabilities...
    
    // ... for node 1
    n1.addInput("data");
    n1.addOutput("data");
    
    // ... for node 2
    n2.addInput("data");
    n2.addOutput("data");
    
    // create skin factory for flow visualization
    FXSkinFactory fXSkinFactory = new FXSkinFactory(canvas.getContentPane());
    
    // generate the ui for the flow
    flow.setSkinFactories(fXSkinFactory);
    
    // added a button in order to save the flow 
    Button save = new Button();
    save.setText("save");
    save.setLayoutX(100);
    save.setLayoutY(100);
    
    // setting mouse action to save the flow
    save.setOnMouseClicked(new EventHandler<MouseEvent>() {
    
        @Override
        public void handle(MouseEvent event) {
            try {
                WorkflowIO.saveToXML(Paths.get("D://flow-01.xml"), flow.getModel());
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    });
    
    // added load button in order to load the flow
    Button load = new Button();
    load.setText("load");
    load.setLayoutX(100);
    load.setLayoutY(200);
    
    // setting mouse action to load the flow
    load.setOnMouseClicked(new EventHandler<MouseEvent>() {
    
        @Override
        public void handle(MouseEvent event) {
            try {
                VFlow flow = WorkflowIO.loadFromXML(Paths.get("D://flow-01.xml"));
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    });
    
    //adding the buttons
    canvas.getChildren().addAll(save, load);
    
    // the usual application setup
    Scene scene = new Scene(canvas, 800, 800);
    primaryStage.setTitle("VWorkflows Tutorial 01");
    primaryStage.setScene(scene);
    primaryStage.show();
    

    }
    }

I've also tried to load the flow direct from the xml from the beginning(loading the flow direct from the xml ), the same issue occurs

So i'm getting a NullPointerException

Exception in thread "JavaFX Application Thread" java.lang.NullPointerException
at eu.mihosoft.vrl.workflow.io.WorkflowIO.toValueObject(WorkflowIO.java:389)
at eu.mihosoft.vrl.workflow.io.WorkflowIO.createFlowFromPersistent(WorkflowIO.java:273)
at eu.mihosoft.vrl.workflow.io.WorkflowIO.flowFromPersistentFlow(WorkflowIO.java:250)
at eu.mihosoft.vrl.workflow.io.WorkflowIO.loadFromXML(WorkflowIO.java:115)
at eu.mihosoft.vrl.workflow.io.WorkflowIO.loadFromXML(WorkflowIO.java:72)
at aa.bc.App$2.handle(App.java:105)
at aa.bc.App$2.handle(App.java:1)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(Unknown Source)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(Unknown Source)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at com.sun.javafx.event.EventUtil.fireEventImpl(Unknown Source)
at com.sun.javafx.event.EventUtil.fireEvent(Unknown Source)
at javafx.event.Event.fireEvent(Unknown Source)
at javafx.scene.Scene$ClickGenerator.postProcess(Unknown Source)
at javafx.scene.Scene$ClickGenerator.access$8300(Unknown Source)
at javafx.scene.Scene$MouseHandler.process(Unknown Source)
at javafx.scene.Scene$MouseHandler.access$1800(Unknown Source)
at javafx.scene.Scene.impl_processMouseEvent(Unknown Source)
at javafx.scene.Scene$ScenePeerListener.mouseEvent(Unknown Source)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(Unknown Source)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(Unknown Source)
at com.sun.glass.ui.View.handleMouseEvent(Unknown Source)
at com.sun.glass.ui.View.notifyMouse(Unknown Source)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.access$300(Unknown Source)
at com.sun.glass.ui.win.WinApplication$4$1.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

(WorkflowIO.java:389) goes here (witch has the TODO that i was talking about)

public static ValueObject toValueObject(VNode node, PersistentValueObject vObj) {
ValueObject result = new DefaultValueObject();

    result.setParent(node);
    // line 389
    result.setValue(vObj.getValue());
    // resulult. // .. TODO visualizationRequest isnot persistent! 11.01.2014

    return result;
}

If there is more information about this issue please do tell and thank you once again for the assistance.

Regards,
Lawrence.

Mouse Click Event ignored on Window

When retrieving a Window for a node, the mouse click event is ignored (e.g. mouse entered does its job!):

VFlow vFlow ...;
VNode vNode ...;

vFlow.getNodeSkinsById(vNode.getId()).stream()
.filter(s -> s instanceof FXFlowNodeSkin)
.map(s -> ((FXFlowNodeSkin) s).getNode())
.forEach(window -> {

            // MouseClick IGNORED!!!!
            window.setOnMouseClicked(mouseEvent ->  System.out.println("Clicked!"));

        });

Host javadocs

Use something like github pages or your own personal domain to host the javadocs

VisualizationRequest.KEY_NODE_NOT_REMOVABLE has no effect

I am trying to disable/hide the 'X' button in a VNode that is rendered in a VCanvas. Here's the code snippet that I wrote to do it:

DefaultValueObject dvo = new DefaultValueObject();
dvo.setValue(myObject);
VNode node = workflow.newNode(dvo);
node.getVisualizationRequest().set(VisualizationRequest.KEY_NODE_NOT_REMOVABLE, true);

Unfortunately, it has no effect. I have tried it both when creating the node, but also inside a custom class that extends the FXFlowNodeSkinBase.

Am I doing something wrong?

PS. Is this project still active?

Is this broken on JavaFX 9?

I tried getting the example described in http://mihosoft.eu/?p=523 to work. I replaced setSkinFactory with setSkinFactories, of course. The result on JavaFX 9 is... nothing.

Is this broken on JavaFX 9? If so, is there a workaround, or a fix, or a...?

NPE if connecting two nodes with mainInputs&mainOutputs

The following example leads to a NPE when trying to connect:

    VFlow flow = FlowFactory.newFlow();

    VNode n1 = flow.newNode();
    n1.setMainOutput(n1.addOutput("control"));
    VNode n2 = flow.newNode();
    Connector receiver = n2.addInput("control");
    n2.setMainInput(receiver);
    flow.connect(n1, n2, "control"); // NPE thrown here

Dangling Connection with Exception

connector ins nowhere

When dropping the connection to nowhere there is a NPE (the Connection stays green and that dropped point like in the picture):

Exception in thread "JavaFX Application Thread" java.lang.NullPointerException
at eu.mihosoft.vrl.workflow.skin.FlowNodeSkinLookupImpl.getById(FlowNodeSkinLookupImpl.java:180)
at eu.mihosoft.vrl.workflow.fx.FlowNodeWindow.connectorsToFront(FlowNodeWindow.java:328)
at eu.mihosoft.vrl.workflow.fx.FlowNodeWindow.access$000(FlowNodeWindow.java:71)
at eu.mihosoft.vrl.workflow.fx.FlowNodeWindow$1.handle(FlowNodeWindow.java:102)
at eu.mihosoft.vrl.workflow.fx.FlowNodeWindow$1.handle(FlowNodeWindow.java:99)
at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)
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.EventUtil.fireEventImpl(EventUtil.java:74)
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
at javafx.event.Event.fireEvent(Event.java:204)
at com.sun.javafx.event.EventQueue.fire(EventQueue.java:48)
at javafx.scene.Scene$MouseHandler.handleEnterExit(Scene.java:3662)
at javafx.scene.Scene$MouseHandler.process(Scene.java:3728)
at javafx.scene.Scene$MouseHandler.access$1800(Scene.java:3471)
at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1695)
at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2486)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:314)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:243)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:345)
at com.sun.glass.ui.View.handleMouseEvent(View.java:526)
at com.sun.glass.ui.View.notifyMouse(View.java:898)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.access$300(WinApplication.java:39)
at com.sun.glass.ui.win.WinApplication$4$1.run(WinApplication.java:112)
at java.lang.Thread.run(Thread.java:744)

JavaFX Window CSS class -> NullPointerException

When setting in the Window a CSS class like

window.setTitleBarStyleClass("object-node-window-titlebar")

there is a NullPointerException (however, the CSS class is visualized correctly!):

12.Jun.2014 18:48:34 [SCHWERWIEGEND] Failed to load skin 'jfxtras.labs.internal.scene.control.skin.window.DefaultWindowSkin' for control FlowNodeWindow@32300f0d[styleClass=window]
java.lang.NullPointerException
at eu.mihosoft.vrl.workflow.fx.FlowNodeWindow$4.changed(FlowNodeWindow.java:134)
at eu.mihosoft.vrl.workflow.fx.FlowNodeWindow$4.changed(FlowNodeWindow.java:126)
at com.sun.javafx.binding.ExpressionHelper$SingleChange.fireValueChangedEvent(ExpressionHelper.java:176)
at com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:80)
at javafx.beans.property.ObjectPropertyBase.fireValueChangedEvent(ObjectPropertyBase.java:105)
at javafx.beans.property.ObjectPropertyBase.markInvalid(ObjectPropertyBase.java:112)
at javafx.beans.property.ObjectPropertyBase.set(ObjectPropertyBase.java:145)
at javafx.css.StyleableObjectProperty.set(StyleableObjectProperty.java:82)
at javafx.scene.control.Control$2.set(Control.java:229)
at javafx.scene.control.Control$2.set(Control.java:212)
at javafx.scene.control.Control.loadSkinClass(Control.java:723)
at javafx.scene.control.Control$5.invalidated(Control.java:657)
at javafx.beans.property.StringPropertyBase.markInvalid(StringPropertyBase.java:109)
at javafx.beans.property.StringPropertyBase.set(StringPropertyBase.java:143)
at javafx.css.StyleableStringProperty.set(StyleableStringProperty.java:83)
at javafx.scene.control.Control$5.set(Control.java:649)
at javafx.css.StyleableStringProperty.applyStyle(StyleableStringProperty.java:69)
at javafx.css.StyleableStringProperty.applyStyle(StyleableStringProperty.java:45)
at javafx.scene.CssStyleHelper.transitionToState(CssStyleHelper.java:786)
at javafx.scene.Node.impl_processCSS(Node.java:8889)
at javafx.scene.Parent.impl_processCSS(Parent.java:1250)
at javafx.scene.control.Control.impl_processCSS(Control.java:872)
at javafx.scene.Parent.impl_processCSS(Parent.java:1281)
at javafx.scene.Parent.impl_processCSS(Parent.java:1281)
at javafx.scene.Parent.impl_processCSS(Parent.java:1281)
at javafx.scene.Parent.impl_processCSS(Parent.java:1281)
at javafx.scene.control.Control.impl_processCSS(Control.java:872)
at javafx.scene.Parent.impl_processCSS(Parent.java:1281)
at javafx.scene.Parent.impl_processCSS(Parent.java:1281)
at javafx.scene.control.Control.impl_processCSS(Control.java:872)
at javafx.scene.Parent.impl_processCSS(Parent.java:1281)
at javafx.scene.Node.impl_processCSS(Node.java:8869)
at javafx.scene.Parent.impl_processCSS(Parent.java:1250)
at javafx.scene.control.Control.impl_processCSS(Control.java:872)
at javafx.scene.Parent.impl_processCSS(Parent.java:1281)
at javafx.scene.Parent.impl_processCSS(Parent.java:1281)
at javafx.scene.Parent.impl_processCSS(Parent.java:1281)
at javafx.scene.Node.processCSS(Node.java:8732)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Scene.doCSSPass(Scene.java:569)
at javafx.scene.Scene.access$3500(Scene.java:201)
at javafx.scene.Scene$ScenePulseListener.pulse(Scene.java:2385)
at com.sun.javafx.tk.Toolkit$3.run(Toolkit.java:322)
at com.sun.javafx.tk.Toolkit$3.run(Toolkit.java:320)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.tk.Toolkit.runPulse(Toolkit.java:320)
at com.sun.javafx.tk.Toolkit.firePulse(Toolkit.java:349)
at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:479)
at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:460)
at com.sun.javafx.tk.quantum.QuantumToolkit$13.run(QuantumToolkit.java:327)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.access$300(WinApplication.java:39)
at com.sun.glass.ui.win.WinApplication$4$1.run(WinApplication.java:112)
at java.lang.Thread.run(Thread.java:744)

High CPU consumption with Adopt Java 15 and OpenJFX 15

We have been using VWorkflows for years in our application successfully. It was based on Oracle Java 1.8_202 and we started to port it to Java 15 now:

  • Adopt JDK 15 (build 15+36)
  • org.openjfx.javafx 15 (et al. from Maven Central)
  • VWorkflows 0.2.4.4

We tested the resulting software under Windows 10 and Mac OS X 10.11.6 and got a performance issue under both operating systems.

Our application started to consume CPU and memory when VWorkflow panels were opened. The more nodes a panel had the more consumption happened. This disappeared when the VWorkflow panels were closed.

Interestingly objects are allocated and deallocated periodically when VWorkflow panels are displayed. This also happens when the application is put into the background.

With profiling tool we were able to see that memory usage is increasing and decreasing continously.

Bildschirmfoto 2020-11-11 um 21 32 19

This at the end leads to higher CPU consumption as well because garbage collection is running on a regular base.

I was able to reproduce this behaviour in our environment using your VWorkflows-Demo project. The screen shot above was taken using VisualVM when the demo application was running.

I had to modfiy the VWorkflows-Demo project in order to get it running under Adopt Java 15. I added a new Launcher class and replaced the main method from Main class. I used Maven as build tool to create native applications by means of Maven plugin JavaPackager.

In order to reproduce please checkout my fork , install Adopt JDK 15 and Maven and run a Maven build on demo project by

cd VWorkflows-Demo
mvn package

Open the resulting application and monitor cpu usage with tools like "top". A constant usage by the demo application is shown. With profiling tools the heap usage can be checked as well.

Error when running Main demo class in latest GitHub code

Clone the GitHub repository and tried to run the latest demo, (or even the simple tutorials found online). I'm getting the following error:

Jul 12, 2017 1:28:24 PM javafx.scene.control.Control impl_processCSS
SEVERE: The -fx-skin property has not been defined in CSS for FlowNodeWindow@671d3524[styleClass=window] and createDefaultSkin() returned null.
Jul 12, 2017 1:28:24 PM javafx.scene.control.Control impl_processCSS
SEVERE: The -fx-skin property has not been defined in CSS for FlowNodeWindow@4c3c8768[styleClass=window] and createDefaultSkin() returned null.
Jul 12, 2017 1:28:24 PM javafx.scene.control.Control impl_processCSS
SEVERE: The -fx-skin property has not been defined in CSS for FlowNodeWindow@2841215b[styleClass=window] and createDefaultSkin() returned null.
Jul 12, 2017 1:28:24 PM javafx.scene.control.Control impl_processCSS
SEVERE: The -fx-skin property has not been defined in CSS for FlowNodeWindow@1aeb0365[styleClass=window] and createDefaultSkin() returned null.
Jul 12, 2017 1:28:24 PM javafx.scene.control.Control impl_processCSS
SEVERE: The -fx-skin property has not been defined in CSS for FlowNodeWindow@53511811[styleClass=window] and createDefaultSkin() returned null.
Jul 12, 2017 1:28:24 PM javafx.scene.control.Control impl_processCSS
SEVERE: The -fx-skin property has not been defined in CSS for FlowNodeWindow@4d9838ba[styleClass=window] and createDefaultSkin() returned null.

net.nemerosa:versioning plugin requires external git client

Currently, the net.nemerosa:versioning plugin depends on git/git.exe executables. This is a disadvantage, especially on Windows. For unexperienced users this behavior causes a lot of trouble since most of the time, the git-client provided by the IDE is sufficient and the dependency to an additional git executable complicates the build process.

See nemerosa/versioning#27 for status updates

Add tutorials to main repo

I think we should add the tutorials from your website and repo as a subproject. Also, if we do that, I think it makes sense to move the code from demo and demo5 of the VWorkflow-FX into the subproject.

NoClassDefFoundError on Linux

I got an exception when I call the connect()-methode of a VFlow:
sheetGraph.connect(outputObj, inputAct);

My setup is:
Linux Mint 17.3
jdk1.8.0_60

It works on windows with same java version.
Thanks in advance!

StackTrace:
Exception in thread "JavaFX Application Thread" java.lang.NoClassDefFoundError: org/apache/commons/math3/geometry/euclidean/twod/Vector2D at eu.mihosoft.vrl.workflow.fx.FXFlowNodeSkin.nodeToSegments(FXFlowNodeSkin.java:752) at eu.mihosoft.vrl.workflow.fx.FXFlowNodeSkin.getConnectorEdges(FXFlowNodeSkin.java:808) at eu.mihosoft.vrl.workflow.fx.FXFlowNodeSkin.layoutConnector(FXFlowNodeSkin.java:369) at eu.mihosoft.vrl.workflow.fx.FXFlowNodeSkin.layoutConnectors(FXFlowNodeSkin.java:314) at eu.mihosoft.vrl.workflow.fx.FXConnectionSkin.add(FXConnectionSkin.java:619) at eu.mihosoft.vrl.workflow.VFlowImpl.createConnectionSkins(VFlowImpl.java:668) at eu.mihosoft.vrl.workflow.VFlowImpl.createConnectionSkins(VFlowImpl.java:646) at eu.mihosoft.vrl.workflow.VFlowImpl.access$500(VFlowImpl.java:71) at eu.mihosoft.vrl.workflow.VFlowImpl$2.onChanged(VFlowImpl.java:310) at com.sun.javafx.collections.ListListenerHelper$SingleChange.fireValueChangedEvent(ListListenerHelper.java:164) 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 eu.mihosoft.vrl.workflow.ConnectionsImpl.add(ConnectionsImpl.java:88) at eu.mihosoft.vrl.workflow.ConnectionsImpl.add(ConnectionsImpl.java:105) at eu.mihosoft.vrl.workflow.FlowModelImpl.connect(FlowModelImpl.java:165) at eu.mihosoft.vrl.workflow.VFlowModelImpl.connect(VFlowModelImpl.java:150) at eu.mihosoft.vrl.workflow.VFlowImpl.connect(VFlowImpl.java:421)

Connections not Showing Up

I'm fairly new at this, but I didn't see any tutorials or sample code online besides those found on this repository.

Basically, I'm using one of the tutorial programs on the website, but it doesn't seem to show any of the connections or the connectors on the nodes themselves. I'll include the code I'm using, as well as a screen shot of what it looks like.

Using Maven build 0.2.4.3

Fire events on window actions

When a node get's selected (e.g. user clicked on it with the mouse) the client who created that node should have the possibility to be aware of such an event. This could be achieved by giving the client the possibility to register for a event handler on such events.

NoClassDefFoundError with Java 8

Demos in eu.mihosoft.vrl.workflow.demo and in eu.mihosoft.vrl.workflow.demo5 thows error ander Java version 8.

Caused by: java.lang.ClassNotFoundException: com.sun.javafx.scene.control.skin.SkinBase

Make it work on JDK >= 11

Since JavaFX moved out of the JDK we need to change JavaFX dependencies for JDK >= 11. We should make sure though that it still works on JDK 8.

ScalableContentPane cause StackOverflowError

Try to run demo in openjdk14+jfx.
Got lot of error message below,tried to mark ScalableContentPane.computeScale then could run?
Don't know why....

"C:\Program Files\Java\jdk-14.0.1\bin\java.exe" -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:63756,suspend=y,server=n -Dfile.encoding=UTF-8 -classpath "D:\00WS\JAVA\FlowChart\VWorkflows-Demo\target\classes;C:\Users\n000000930\.m2\repository\org\openjfx\javafx-controls\14.0.1\javafx-controls-14.0.1.jar;C:\Users\n000000930\.m2\repository\org\openjfx\javafx-controls\14.0.1\javafx-controls-14.0.1-win.jar;C:\Users\n000000930\.m2\repository\org\openjfx\javafx-base\14.0.1\javafx-base-14.0.1.jar;C:\Users\n000000930\.m2\repository\org\openjfx\javafx-base\14.0.1\javafx-base-14.0.1-win.jar;C:\Users\n000000930\.m2\repository\org\openjfx\javafx-graphics\14.0.1\javafx-graphics-14.0.1.jar;C:\Users\n000000930\.m2\repository\org\openjfx\javafx-graphics\14.0.1\javafx-graphics-14.0.1-win.jar;C:\Users\n000000930\.m2\repository\org\openjfx\javafx-swing\14.0.1\javafx-swing-14.0.1.jar;C:\Users\n000000930\.m2\repository\org\openjfx\javafx-swing\14.0.1\javafx-swing-14.0.1-win.jar;C:\Users\n000000930\.m2\repository\org\openjfx\javafx-fxml\14\javafx-fxml-14.jar;C:\Users\n000000930\.m2\repository\org\openjfx\javafx-fxml\14\javafx-fxml-14-win.jar;D:\00WS\JAVA\FlowChart\VWorkflows-FX\target\classes;D:\00WS\JAVA\FlowChart\VWorkflows-Core\target\classes;C:\Users\n000000930\.m2\repository\com\thoughtworks\xstream\xstream\1.4.12\xstream-1.4.12.jar;C:\Users\n000000930\.m2\repository\xmlpull\xmlpull\1.1.3.1\xmlpull-1.1.3.1.jar;C:\Users\n000000930\.m2\repository\xpp3\xpp3_min\1.1.4c\xpp3_min-1.1.4c.jar;C:\Users\n000000930\.m2\repository\net\sf\jung\jung-api\2.1.1\jung-api-2.1.1.jar;C:\Users\n000000930\.m2\repository\com\google\guava\guava\19.0\guava-19.0.jar;C:\Users\n000000930\.m2\repository\net\sf\jung\jung-graph-impl\2.1.1\jung-graph-impl-2.1.1.jar;C:\Users\n000000930\.m2\repository\net\sf\jung\jung-algorithms\2.1.1\jung-algorithms-2.1.1.jar;C:\Users\n000000930\.m2\repository\net\sf\jung\jung-visualization\2.1.1\jung-visualization-2.1.1.jar;C:\Users\n000000930\.m2\repository\org\apache\commons\commons-math3\3.6.1\commons-math3-3.6.1.jar;C:\Users\n000000930\.m2\repository\eu\mihosoft\jfx\scaledfx\scaledfx\0.6\scaledfx-0.6.jar;C:\Users\n000000930\.m2\repository\org\openjfx\javafx-controls\11.0.2\javafx-controls-11.0.2-mac.jar;C:\Users\n000000930\.m2\repository\org\openjfx\javafx-fxml\11.0.2\javafx-fxml-11.0.2-mac.jar;C:\Users\n000000930\.m2\repository\org\openjfx\javafx-graphics\11.0.2\javafx-graphics-11.0.2-mac.jar;C:\Users\n000000930\.m2\repository\org\openjfx\javafx-base\11.0.2\javafx-base-11.0.2-mac.jar;C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2020.1\lib\idea_rt.jar" eu.mihosoft.vrl.workflow.demo.GUIstart
Connected to the target VM, address: '127.0.0.1:63756', transport: 'socket'
 >> generate workflowException in Application start method
Exception in thread "main" java.lang.RuntimeException: Exception in Application start method
	at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:900)
	at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195)
	at java.base/java.lang.Thread.run(Thread.java:832)
Caused by: java.lang.StackOverflowError
	at javafx.scene.Parent.doComputeGeomBounds(Parent.java:1492)
	at javafx.scene.Parent$1.doComputeGeomBounds(Parent.java:115)
	at com.sun.javafx.scene.ParentHelper.computeGeomBoundsImpl(ParentHelper.java:84)
	at com.sun.javafx.scene.layout.RegionHelper.superComputeGeomBoundsImpl(RegionHelper.java:78)
	at com.sun.javafx.scene.layout.RegionHelper.superComputeGeomBounds(RegionHelper.java:62)
	at javafx.scene.layout.Region.doComputeGeomBounds(Region.java:3289)
	at javafx.scene.layout.Region$1.doComputeGeomBounds(Region.java:168)
	at com.sun.javafx.scene.layout.RegionHelper.computeGeomBoundsImpl(RegionHelper.java:89)
	at com.sun.javafx.scene.NodeHelper.computeGeomBounds(NodeHelper.java:115)
	at javafx.scene.Node.updateGeomBounds(Node.java:3843)
	at javafx.scene.Node.getGeomBounds(Node.java:3805)
	at javafx.scene.Node.getLocalBounds(Node.java:3753)
	at javafx.scene.Node.updateTxBounds(Node.java:3907)
	at javafx.scene.Node.getTransformedBounds(Node.java:3699)
	at javafx.scene.Parent.getChildTransformedBounds(Parent.java:1848)
	at javafx.scene.Parent.updateCachedBounds(Parent.java:1709)
	at javafx.scene.Parent.recomputeBounds(Parent.java:1648)
	at javafx.scene.Parent.doComputeGeomBounds(Parent.java:1501)
	at javafx.scene.Parent$1.doComputeGeomBounds(Parent.java:115)
	at com.sun.javafx.scene.ParentHelper.computeGeomBoundsImpl(ParentHelper.java:84)
	at com.sun.javafx.scene.layout.RegionHelper.superComputeGeomBoundsImpl(RegionHelper.java:78)
	at com.sun.javafx.scene.layout.RegionHelper.superComputeGeomBounds(RegionHelper.java:62)
	at javafx.scene.layout.Region.doComputeGeomBounds(Region.java:3289)
	at javafx.scene.layout.Region$1.doComputeGeomBounds(Region.java:168)
	at com.sun.javafx.scene.layout.RegionHelper.computeGeomBoundsImpl(RegionHelper.java:89)
	at com.sun.javafx.scene.NodeHelper.computeGeomBounds(NodeHelper.java:115)
	at javafx.scene.Node.updateGeomBounds(Node.java:3843)
	at javafx.scene.Node.getGeomBounds(Node.java:3805)
	at javafx.scene.Node.getLocalBounds(Node.java:3753)
	at javafx.scene.Node.updateTxBounds(Node.java:3907)
	at javafx.scene.Node.getTransformedBounds(Node.java:3699)
	at javafx.scene.Parent.getChildTransformedBounds(Parent.java:1848)
	at javafx.scene.Parent.recomputeBounds(Parent.java:1637)
	at javafx.scene.Parent.doComputeGeomBounds(Parent.java:1501)
	at javafx.scene.Parent$1.doComputeGeomBounds(Parent.java:115)
	at com.sun.javafx.scene.ParentHelper.computeGeomBoundsImpl(ParentHelper.java:84)
	at com.sun.javafx.scene.layout.RegionHelper.superComputeGeomBoundsImpl(RegionHelper.java:78)
	at com.sun.javafx.scene.layout.RegionHelper.superComputeGeomBounds(RegionHelper.java:62)
	at javafx.scene.layout.Region.doComputeGeomBounds(Region.java:3289)
	at javafx.scene.layout.Region$1.doComputeGeomBounds(Region.java:168)
	at com.sun.javafx.scene.layout.RegionHelper.computeGeomBoundsImpl(RegionHelper.java:89)
	at com.sun.javafx.scene.NodeHelper.computeGeomBounds(NodeHelper.java:115)
	at javafx.scene.Node.updateGeomBounds(Node.java:3843)
	at javafx.scene.Node.getGeomBounds(Node.java:3805)
	at javafx.scene.Node.getLocalBounds(Node.java:3753)
	at javafx.scene.Node$MiscProperties$3.computeBounds(Node.java:6843)
	at javafx.scene.Node$LazyBoundsProperty.get(Node.java:9777)
	at javafx.scene.Node$LazyBoundsProperty.get(Node.java:9747)
	at javafx.beans.binding.ObjectExpression.getValue(ObjectExpression.java:49)
	at com.sun.javafx.binding.ExpressionHelper$SingleChange.fireValueChangedEvent(ExpressionHelper.java:177)
	at com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:80)
	at javafx.scene.Node$LazyBoundsProperty.invalidate(Node.java:9787)
	at javafx.scene.Node$MiscProperties.invalidateBoundsInLocal(Node.java:6871)
	at javafx.scene.Node.invalidateBoundsInLocal(Node.java:3464)
	at javafx.scene.Node.localBoundsChanged(Node.java:4036)
	at javafx.scene.Node.doGeomChanged(Node.java:4023)
	at javafx.scene.Node$1.doGeomChanged(Node.java:462)
	at com.sun.javafx.scene.NodeHelper.geomChangedImpl(NodeHelper.java:184)
	at com.sun.javafx.scene.NodeHelper.geomChanged(NodeHelper.java:137)
	at javafx.scene.Parent.childBoundsChanged(Parent.java:1873)
	at javafx.scene.Node.notifyParentOfBoundsChange(Node.java:4094)
	at javafx.scene.Node.transformedBoundsChanged(Node.java:4055)
	at javafx.scene.Node.localBoundsChanged(Node.java:4037)
	at javafx.scene.Node.doGeomChanged(Node.java:4023)
	at javafx.scene.Node$1.doGeomChanged(Node.java:462)
	at com.sun.javafx.scene.NodeHelper.geomChangedImpl(NodeHelper.java:184)
	at com.sun.javafx.scene.NodeHelper.geomChanged(NodeHelper.java:137)
	at javafx.scene.Parent.childBoundsChanged(Parent.java:1873)
	at javafx.scene.Node.notifyParentOfBoundsChange(Node.java:4094)
	at javafx.scene.Node.transformedBoundsChanged(Node.java:4055)
	at javafx.scene.Node.localBoundsChanged(Node.java:4037)
	at javafx.scene.Node.doGeomChanged(Node.java:4023)
	at javafx.scene.Node$1.doGeomChanged(Node.java:462)
	at com.sun.javafx.scene.NodeHelper.geomChangedImpl(NodeHelper.java:184)
	at com.sun.javafx.scene.NodeHelper.geomChanged(NodeHelper.java:137)
	at javafx.scene.Parent.childBoundsChanged(Parent.java:1873)
	at javafx.scene.Node.notifyParentOfBoundsChange(Node.java:4094)
	at javafx.scene.Node.transformedBoundsChanged(Node.java:4055)
	at javafx.scene.Node.doTransformsChanged(Node.java:4998)
	at javafx.scene.Node$1.doTransformsChanged(Node.java:445)
	at com.sun.javafx.scene.NodeHelper.transformsChangedImpl(NodeHelper.java:170)
	at com.sun.javafx.scene.NodeHelper.transformsChanged(NodeHelper.java:119)
	at javafx.scene.transform.Transform.transformChanged(Transform.java:2109)
	at javafx.scene.transform.Scale$1.invalidated(Scale.java:128)
	at javafx.beans.property.DoublePropertyBase.markInvalid(DoublePropertyBase.java:113)
	at javafx.beans.property.DoublePropertyBase.set(DoublePropertyBase.java:148)
	at javafx.scene.transform.Scale.setX(Scale.java:115)
	at eu.mihosoft.scaledfx.ScalableContentPane.computeScale(ScalableContentPane.java:197)
	at eu.mihosoft.scaledfx.ScalableContentPane.lambda$new$0(ScalableContentPane.java:70)
	at com.sun.javafx.binding.ExpressionHelper$SingleChange.fireValueChangedEvent(ExpressionHelper.java:181)

Implementation question

I had an idea for an application that could be visualized using VWorkflows. The idea is to have events that trigger specific actions (for example a scheduled task or watching a directory for a new file). The trigger will then provide the specific file or a start signal to the next node that will be process the file in a specific manner. The goal is to create a tool that can be used to automate tasks (like sorting files, triggering backups etc.). All actions (like moving, copying, renaming files, deleting) could be visualized as a node with an input of accepts a file and an output that provides the new file or nothing.
I couldn't really figure out how to pass information from one node to another via a connection. I created two nodes with the same type of output and input, connected them and tried to pass data over via the value object property but that doesn't seem to work out that well.
Could you help me out please? Any help is appreciated. I tried to look into vrlstudio but couldn't find the part where data is transmitted/received via the node's connections.

Add event handler for connection

Hello,

Would someone enlighten me on how to add event handlers for connections in the controller? I know that we can define custom connection skin and handle in there but I would like to manipulate connection objects from inside my controllers.

Thanks.

Multiple in / out

Hi, very nice project you have here.

I have watched a couple videos and scanned some code, I couldn't figure out if this library allows for multiple in and out connections to a node. In all the videos I only see one in and out per node.

I have a use case where I would definitely use this library and possibly help contribute if I were able to hook up multiple connections to nodes. Sorry if there is api where this would be obvious, I tried to find the answer quickly. :)

Mike

Exception when starting a new scene

Everything is ok until I try to visualize the java fx scene:

        // create a flow object
        VFlow flow = FlowFactory.newFlow();

        // add two nodes to the flow
        VNode n1 = flow.newNode();
        VNode n2 = flow.newNode();

        // create input and output connectors of type "default-type"
        Connector inN1 = n1.addInput("default-type");
        Connector outN1 = n1.addOutput("default-type");
        Connector inN2 = n2.addInput("default-type");
        Connector outN2 = n2.addOutput("default-type");

        // create a connections
        flow.connect(outN1, inN2);
        // we assume a flow already exists
        // make the flow visible
        flow.setVisible(true);

        // create a zoomable canvas
        VCanvas canvas = new VCanvas();
        Pane root = (Pane) canvas.getContent();

        // creating a skin factory and attach it to the flow
        FXSkinFactory skinFactory = new FXSkinFactory(root);
        flow.setSkinFactories(skinFactory);
        
        Scene scene = new Scene(canvas);
        primaryStage.setTitle("Try");
        primaryStage.setScene(scene);
        primaryStage.show();// create a flow object
        VFlow flow = FlowFactory.newFlow();

        // add two nodes to the flow
        VNode n1 = flow.newNode();
        VNode n2 = flow.newNode();

        // create input and output connectors of type "default-type"
        Connector inN1 = n1.addInput("default-type");
        Connector outN1 = n1.addOutput("default-type");
        Connector inN2 = n2.addInput("default-type");
        Connector outN2 = n2.addOutput("default-type");

        // create a connections
        flow.connect(outN1, inN2);
        // we assume a flow already exists
        // make the flow visible
        flow.setVisible(true);

        // create a zoomable canvas
        VCanvas canvas = new VCanvas();
        Pane root = (Pane) canvas.getContent();

        // creating a skin factory and attach it to the flow
        FXSkinFactory skinFactory = new FXSkinFactory(root);
        flow.setSkinFactories(skinFactory);
        
        Scene scene = new Scene(canvas);
        primaryStage.setTitle("Try");
        primaryStage.setScene(scene);
        primaryStage.show();

I get the following error:

Exception in Application start method
java.lang.reflect.InvocationTargetException
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389)
	at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767)
Caused by: java.lang.RuntimeException: Exception in Application start method
	at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917)
	at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$154(LauncherImpl.java:182)
	at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.NullPointerException
	at jfxtras.scene.control.window.Window.getUserAgentStylesheet(Window.java:501)
	at com.sun.javafx.css.StyleManager.findMatchingStyles(StyleManager.java:1683)
	at javafx.scene.CssStyleHelper.createStyleHelper(CssStyleHelper.java:111)
	at javafx.scene.Node.reapplyCss(Node.java:8985)
	at javafx.scene.Node.reapplyCss(Node.java:9014)
	at javafx.scene.Node.reapplyCss(Node.java:9014)
	at javafx.scene.Node.impl_reapplyCSS(Node.java:8948)
	at javafx.scene.Node.invalidatedScenes(Node.java:856)
	at javafx.scene.Node.setScenes(Node.java:921)
	at javafx.scene.Scene$9.invalidated(Scene.java:1119)
	at javafx.beans.property.ObjectPropertyBase.markInvalid(ObjectPropertyBase.java:111)
	at javafx.beans.property.ObjectPropertyBase.set(ObjectPropertyBase.java:146)
	at javafx.scene.Scene.setRoot(Scene.java:1072)
	at javafx.scene.Scene.<init>(Scene.java:347)
	at javafx.scene.Scene.<init>(Scene.java:194)
	at sample.Main.start(Main.java:109)
	at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$161(LauncherImpl.java:863)
	at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$174(PlatformImpl.java:326)
	at com.sun.javafx.application.PlatformImpl.lambda$null$172(PlatformImpl.java:295)
	at java.security.AccessController.doPrivileged(Native Method)
	at com.sun.javafx.application.PlatformImpl.lambda$runLater$173(PlatformImpl.java:294)
	at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
	at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
	at com.sun.glass.ui.win.WinApplication.lambda$null$147(WinApplication.java:177)
	... 1 more
Exception running application sample.Main

which is triggered by the
new Scene(canvas)
line

did this happen to anybody else?

Content of nodes added to flow after setting up skin factories doesn't get updated

With code like:

    flow = loadFlow();
    addNode("1");

    // create skin factory for flow visualization
    FXValueSkinFactory fXSkinFactory = new FXValueSkinFactory(rootPane);
    // register visualizations for various types
    fXSkinFactory.addSkinClassForValueType(Example.class, ExampleFlowNodeSkin.class);
    // generate the ui for the flow
    flow.setSkinFactories(fXSkinFactory);
    addNode("2");

The second added node appears empty as FXFlowNodeSkinBase's updateView() never gets called for it. I suggest watching the flow for new nodes and acting on them too.

Unlinked connection when Node is dragged

I've seen this behavior a couple of times already, but can't exactly pinpoint the minimum list of steps to reproduce.

Having a flow with two nodes. The first node has 1 output, the second node has 2 inputs. All data ports are compatible.
Make a connection between output1 and input1.
Make a connection between output1 and input2.
Drag the second node a couple of times.
Click on the first node, then drag the second node again.

Sometimes the second connection (the line) will stay in place while the first connection is dragged correctly when the second node us dragged.

The only way to remove the unlinked connection is to click on the line to bring up the context menu and click on the "remove connection" menu item.

SVG canvas zooms when node is moved to its borders

I find difficult to manipulate a visualization when a node is moved to the border of the canvas. This results in a zoom out operation, making it hard to position nodes.

It would be great if the zoom of the canvas stayed fixed by default. A compatibility flag could be added to retain the existing behavior.

A bound value cannot be set

I am running a modified and simplified version of your demo within Luna Eclipse and Java 8.

I can add a node just fine, however, when I add an input or output, I get the following error:

Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: A bound value cannot be set.
at javafx.beans.property.DoublePropertyBase.set(DoublePropertyBase.java:142)
at javafx.scene.Node.setLayoutX(Node.java:2412)
at javafx.scene.Node.relocate(Node.java:2538)
at javafx.scene.Node.resizeRelocate(Node.java:2891)
at javafx.scene.layout.AnchorPane.layoutChildren(AnchorPane.java:363)
at javafx.scene.Parent.layout(Parent.java:1076)
at javafx.scene.Parent.layout(Parent.java:1082)
at javafx.scene.Parent.layout(Parent.java:1082)
at javafx.scene.Parent.layout(Parent.java:1082)
at javafx.scene.Parent.layout(Parent.java:1082)
at javafx.scene.Parent.layout(Parent.java:1082)
at javafx.scene.Scene.doLayoutPass(Scene.java:576)
at javafx.scene.Scene$ScenePulseListener.pulse(Scene.java:2386)
at com.sun.javafx.tk.Toolkit$3.run(Toolkit.java:321)
at com.sun.javafx.tk.Toolkit$3.run(Toolkit.java:319)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.tk.Toolkit.runPulse(Toolkit.java:319)
at com.sun.javafx.tk.Toolkit.firePulse(Toolkit.java:348)
at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:479)
at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:460)
at com.sun.javafx.tk.quantum.QuantumToolkit$13.run(QuantumToolkit.java:327)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.access$300(WinApplication.java:39)
at com.sun.glass.ui.win.WinApplication$4$1.run(WinApplication.java:112)
at java.lang.Thread.run(Thread.java:745)

Any clue what I am doing wrong?

Allow customizations of context menu found in connection

The current connection skin presents a simple context menu with a single option to break the connection. This code is hidden under a private method. It would be great if the base skin class allowed further customizations.

Suggestion: use protected methods, the template method pattern, and other strategies to open this class for extension.

Selecting thin connections

Trying to click on a thin connection (strokeWidth=1.0) is almost impossible. Is it possible to increase the mouse-sensitive area without changing the stroke width?

Commented out (dead) code.

The following classes in VWorkflows-Core are completely commented out:

  • DefaultWorkflow.java
  • ControlFlow.java
  • ControlFlowImpl.java
  • LayoutFactoy.java

Can they be deleted?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.