Collection of Binding helpers for JavaFX(8)

Related tags

javafx javafx-library
Overview

Advanced-Bindings for JavaFX (8)

Build Status

advanced-bindings is a collection of useful helpers and custom binding implementations to simplify the development of applications that are heavily based on JavaFX's Properties and Bindings.

New Features?

If you have ideas for new custom bindings that could be added to the library feel free to add an issue.

Links

JavaDoc

## Maven Dependencies

Advanced-Bindings releases are available in the Maven Central Repository. You can use it like this:

Stable release

Gradle:

compile 'eu.lestard:advanced-bindings:0.4.0'

Maven:

<dependency>
    <groupId>eu.lestard</groupId>
    <artifactId>advanced-bindings</artifactId>
    <version>0.4.0</version>
</dependency>

Current Development version (Snapshot)

The development version is published automatically to the Sonatype Snapshot repository.

Gradle

repositories {
    maven {
        url "https://oss.sonatype.org/content/repositories/snapshots/"
    }
}

dependencies {
    compile 'eu.lestard:advanced-bindings:0.5.0-SNAPSHOT'
}

Maven

<dependency>
    <groupId>eu.lestard</groupId>
    <artifactId>advanced-bindings</artifactId>
    <version>0.5.0-SNAPSHOT</version>
</dependency>

Features

MathBindings

eu.lestard.advanced_bindings.api.MathBindings.*

Contains Bindings for all methods of java.lang.Math

Example:

@Test
public void testPow(){

    DoubleProperty a = new SimpleDoubleProperty(3);
    DoubleProperty b = new SimpleDoubleProperty(2);

    final DoubleBinding pow = MathBindings.pow(a, b);

    // 3^2 = 9
    assertThat(pow).hasValue(9.0);

    a.set(5);
    b.set(3);

    // 5^3 = 125
    assertThat(pow).hasValue(125.0);
}

NumberBindings

Example: safeDevide A binding to express a division like Bindings.divide with the difference that no ArithmeticException will be thrown when a division by zero happens. Instead a default value of 0 is used (or another value defined by the user).

This can be useful because with the standard divide binding you can run into problems when defining something like this:

IntegerProperty a = new SimpleIntegerProperty();
IntegerProperty b = new SimpleIntegerProperty();

NumberBinding result = Bindings
  .when(b.isEqualTo(0))
  .then(0)
  .otherwise(a.divide(b));

This won't work as expected and will throw an ArithmeticException because the expression a.divide(b) is evaluated independently from the b.isEqualTo(0) condition.

With Advanced-Bindings you can write this instead:

IntegerProperty a = new SimpleIntegerProperty();
IntegerProperty b = new SimpleIntegerProperty();

IntegerBinding result = NumberBindings.divideSafe(a,b);

This won't throw an ArithmenticException even when b has a value of 0. While this is "wrong" from a mathematical point of view it can simplify the development of bindings based applications a lot, for example when b is bound to a Slider that has an initial value of 0.

Example: isNaN

@Test
public void testIsNan(){
    DoubleProperty a = new SimpleDoubleProperty();
    DoubleProperty b = new SimpleDoubleProperty();

    final DoubleBinding quotient = a.divide(b);
    BooleanBinding nan = NumberBindings.isNaN(quotient);


    a.set(2);
    b.set(4);

    assertThat(nan).isFalse();


    a.set(0);
    b.set(0);

    assertThat(nan).isTrue();
}

Example: isInfinite

@Test
public void testIsInfinite(){
    DoubleProperty a = new SimpleDoubleProperty();
    DoubleProperty b = new SimpleDoubleProperty();

    DoubleBinding product =  a.multiply(b);

    BooleanBinding infinite = NumberBindings.isInfinite(product);


    a.set(2);
    b.set(4);

    assertThat(infinite).isFalse();

    b.set(Double.MAX_VALUE);

    assertThat(infinite).isTrue();
}

StringBindings

Example: RegExp

@Test
public void testMatches(){
    StringProperty text = new SimpleStringProperty();

    String pattern = "[0-9]*";  // only numbers are allowed

    BooleanBinding matches = StringBindings.matches(text, pattern);


    text.set("19");

    assertThat(matches).isTrue();


    text.set("no number");

    assertThat(matches).isFalse();
}

CollectionBindings

Example: Sum of all integers in an observable list

@Test
public void testSum(){
    ObservableList<Integer> numbers = FXCollections.observableArrayList();

    NumberBinding sum = CollectionBindings.sum(numbers);


    numbers.addAll(1, 2, 3, 5, 8, 13, 21);

    assertThat(sum).hasValue(53.0);

    numbers.add(34);

    assertThat(sum).hasValue(87.0);
}

SwitchBindings

In JavaFX there are standard methods to create IF-THEN-ELSE bindings. But there is no way to create something like a switch for use cases where there are a lot of cases.

Advanced-Bindings has a builder to create switch like bindings:

IntegerProperty base = new SimpleIntegerProperty();

ObservableValue<String> result = switchBinding(base, String.class)
      .bindCase(1, i -> "one")
      .bindCase(3, i -> "three")
      .bindCase(10, i -> "ten")
      .bindDefault(() -> "nothing")
      .build();

There are two differences to the normal switch statement of Java:

  • While the standard switch statement has a limitation to numbers, Strings and Enums. Only those types can be used as control variable. There is no such limitation for the Switch binding. Every type that has a properly overwritten equals method can be used.
  • There is no "fall-through" and therefore no break is needed.
Issues
  • Several updates to the build setup

    Several updates to the build setup

    • apply license plugin. format all files with proper license headers.
    • append LICENSE file to JAR.
    • append extra JAR manifest properties.
    • update build dependencies.
    opened by aalmiray 2
  • Update gradle wrapper

    Update gradle wrapper

    The gradle wrapper is long overdue for an update, especially since gradle 2.3 is no longer supported by IntelliJ.

    I unfortunately had to (temporarily) remove the sonar-runner plugin because it's no longer available. I know there are alternatives, but I have no idea what sonar-runner actually is, so I didn't try replacing it myself (yet). I'd love to hear if and how I can/should replace it!

    opened by HoldYourWaffle 1
  • Add Collection overloads to LogicBindings

    Add Collection overloads to LogicBindings

    Title says it all. Closes #5.

    I also changed the filter.findAny.isPresent chains to allMatch and anyMatch for readability and (minor) performance improvement.

    opened by HoldYourWaffle 1
  • AND / OR BooleanBindings with variable number of arguments

    AND / OR BooleanBindings with variable number of arguments

    BooleanProperty a = new SimpleBooleanProperty(true);
    BooleanProperty b = new SimpleBooleanProperty(true);
    BooleanProperty c = new SimpleBooleanProperty(false);
    
    BooleanBinding result = LogicBindings.and(a, b, c);
    
    assertThat(result).isFalse();
    
    opened by manuel-mauky 0
  • Division binding with default value for division by zero cases

    Division binding with default value for division by zero cases

    With the standard Bindings of JavaFX you can create a binding like this:

    IntegerProperty a = new SimpleIntegerProperty();
    IntegerProperty b = new SimpleIntegerProperty();
    
    NumberBinding result = Bindings.when(a.isEqualTo(0)).then(0).otherwise(a.divide(b));
    

    However this will throw an ArithmeticException because of a division by zero.

    To solve these cases add a binding like this:

    NumberBinding result = NumberBindings.divideSafe(a, b, 0);
    

    In this example the third parameter is a default value that is used everytime a division by zero is happening.

    enhancement 
    opened by manuel-mauky 0
  • LogicBindings with Collection<>

    LogicBindings with Collection<>

    At the moment the LogicBindings methods for or and and bindings are taking a varargs array of ObservableBooleanValue.

    Add an overloaded method that takes a Collection or List of elements instead of a varargs array.

    opened by manuel-mauky 0
  • Additional bindings

    Additional bindings

    Adds min/max/average operations to collections Adds reduce / reduceAndMap to collections Adds a transforming operation to String

    opened by aalmiray 0
  • BigdecimalProperty

    BigdecimalProperty

    JavaFX misses BigDecimalProperties, so you can't use them like IntegerProperties with the fluent API of the NumberProperty.

    https://docs.oracle.com/javafx/2/api/javafx/beans/binding/NumberExpressionBase.html shows the available implementations (DoubleExpression, FloatExpression, IntegerExpression, LongExpression)

    An implementation for BigDecimals would be usefull. (Got them requested in workshops)

    opened by sialcasa 1
Releases(v0.3.0)
Owner
Manuel Mauky
Manuel Mauky
Reactive JavaFX Event Handling

ReactorFX This lightweight convenience library allows for simple integration between Project Reactor and JavaFX. ReactorFX provides fluent factories t

Jake 18 Nov 10, 2020
A scientific charting library focused on performance optimised real-time data visualisation at 25 Hz update rates for data sets with a few 10 thousand up to 5 million data points.

ChartFx ChartFx is a scientific charting library developed at GSI for FAIR with focus on performance optimised real-time data visualisation at 25 Hz u

GSI CS-CO/ACO 250 Apr 24, 2021
📊 Exposing charts from Java to JavaFX and the Web!

Exposing charts from Java to JavaFX and to the Web! JavaFX · Charts · Websockets · Jetty · Web JavaFxDataviewer is an open-source data visualization t

jasrodis 56 Oct 27, 2020
Simple and clean testing for JavaFX.

TestFX Simple and clean testing for JavaFX. TestFX requires a minimum Java version of 8 (1.8). Documentation See the Javadocs for latest master. See t

null 698 Mar 12, 2021
Reactive event streams, observable values and more for JavaFX.

ReactFX ReactFX is an exploration of (functional) reactive programming techniques for JavaFX. These techniques usually result in more concise code, le

Tomas Mikula 336 Mar 8, 2021
Provides a Java API to use the JavaScript library d3.js with the JavaFx WebView

javafx-d3 Provides a Java API for using the JavaScript library d3.js with JavaFx Applications. Many thanks to the authors of the projects gwt-d3 [1] a

null 90 Feb 13, 2021
Full Featured Google Chrome Dev Tools to JavaFX WebView browser debugging.

JavaFX WebView Debugger Via WebSocket connection to Google Chrome Dev Tools JavaFx WebView debugging with Chrome Dev tools is highly dependent on Goog

Vladimir Schneider 45 Jan 29, 2021
图形化漏洞利用Demo-JavaFX版

更新 V1.1 参考冰蝎的代理,添加代理设置,方便走burp调试 优化批量检查逻辑,使用接口,这样每次添加新的漏洞利用时,就不需要修改批量检查的逻辑。 0x01 这是个嘛? 这是一个构建图形化漏洞利用的一个项目,已经写好架子,只需要往里填充exp即可,帮助安全人员快速构建一个图形化的、跨平台的漏洞利

yhy 56 Apr 7, 2021
Custom JavaFX bindings made easy with lambdas.

EasyBind EasyBind leverages lambdas to reduce boilerplate when creating custom bindings, provides a type-safe alternative to Bindings.select* methods

Tomas Mikula 142 Feb 13, 2021
Collection of Binding helpers for JavaFX(8)

Advanced-Bindings for JavaFX (8) advanced-bindings is a collection of useful helpers and custom binding implementations to simplify the development of

Manuel Mauky 60 Mar 6, 2021
Lib-Tile is a multi Maven project written in JavaFX and NetBeans IDE 8 and provides the functionalities to use and handle easily Tiles in your JavaFX application.

Lib-Tile Intention Lib-Tile is a multi Maven project written in JavaFX and NetBeans IDE and provides the functionalities to use and handle easily Tile

Peter Rogge 11 Jun 8, 2020
Functional Reactive Programming (FRP) for JavaFX

ReduxFX Functional Reactive Programming (FRP) for JavaFX ReduxFX in 1 minute ReduxFX is a set of libraries that enable you to use functional reactive

Michael Heinrichs 104 Feb 28, 2021
A collection of JavaFX controls and utilities.

GemsFX At least JDK 11 is required. Dialog Pane The class DialogPane can be used as a layer on top of any application. It offers various methods to di

DLSC Software & Consulting GmbH 146 Mar 11, 2021
A collection of tools and libraries for easier development on the JavaFX platform!

This project is archived I do not realistically have the time to take care of this project, unfortunately. It originally was built along a Twitter cli

Tristan Deloche 102 Feb 15, 2021