Oct 16

MQTT.fx 0.0.10 released

MQTT.fx 0.0.10 was released.

Download latest binaries in all flavours at mqttfx.org.
Bugs and feature requests can be reported via the issue tracker.

New in this version:
MQTT-Message Clipboard

Option to copy the message payload to clipboard
copypayload
Service menus at publish and subscription panel: now you can clear received messages buffer and the recent topics lists
publish_service
subscribe_service

Extended logging to mqttfx.log
Added Application Window Icon (for Windows)
Now running/bundled with Java 8u20
Updated 3rd-party libs (e.g. ControlsFX 8.20.7)

Oct 15

ShichimiFX – Yet another JavaFX utils lib

shichimi

ShichimiFX is a small lib containing helper/util classes extracted from my other projects which I commonly need. The lib will be extended if it turns out that I need a util class in more than one project…
(Shichimi is my favorite Japanese spice mixture)

And yes it also yet another utils lib containing (among others):

For further details refer to the ShichimiFX Bitbucket Repo

 

Maven

<dependency>
  <groupId>de.jensd</groupId>
  <artifactId>shichimifx</artifactId>
  <version>1.0.0</version>
</dependency>
Oct 09

The JDK 8u20 “Tap trap”

When switching MQTT.fx to JDK 8u20 I was nicked by the fix of RT-24658.
The fix definitely makes sense but may clash with my TabPaneDetacher approach.

In MQTT.fx the content of the Tabs is disabled as long the MQTT-Broker is not connected.
And I am using Property Bindings for this. E.g. in the PublishController “publishBox” is the root of the Publish-Tab content and it is bound to the brokerConnectedProperty():

publishBox.disableProperty().bind(model.brokerConnectedProperty().not());

This worked well until JDK 8u20 as now this leads into:

Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: A bound value cannot be set.
at javafx.beans.property.BooleanPropertyBase.set(BooleanPropertyBase.java:139)
at javafx.scene.Node.setDisable(Node.java:1539)
[...]

This is because each time when e.g. adding a Tab to a TabPane updateDisabled() is called to explicitly SET the disabled value of the content also:

 private void updateDisabled() {
        boolean disabled = isDisable() || (getTabPane() != null && getTabPane().isDisabled());
        setDisabled(disabled);

        // Fix for RT-24658 - content should be disabled if the tab is disabled
        Node content = getContent();
        if (content != null) {
            content.setDisable(disabled);
        }
    }

Options to deal with this:
Quit using Binding here and use ChangeListener instead.
Or simply wrap the content root in another Pane.

Sep 19

FontAwesomeFX 8.0.10 released

FontAwesomeFX 8.0.10 introduces Stacked Icons and FXML support

Binaries: Download
Sources: Bitbucket
Maven:

<dependency>
  <groupId>de.jensd</groupId>
  <artifactId>fontawesomefx</artifactId>
  <version>8.0.10</version>
</dependency>

Stacked Icons

FontAwesome is featuring Stacked Icons which is clearly also for JavaFX Applications this is a useful feature.

To support Stackend Icons FontAwesomeFX 8.0.10 comes with two new classes: AwesomeIconsStack and Icon.

AwesomeIconsStack
is basically a StackPane providing convent methods to add and remove Icons.

Icon
is a Node which is able to display a styleable FontAwesome icon. Icons can be styled in two ways:

by setting a style class:

Region stackedIcon2 = AwesomeIconsStack.create()
                .add(Icon.create()
                        .icon(AwesomeIcon.SQUARE)
                        .size("3em")
                        .styleClass("stack-base"))
                .add(Icon.create()
                        .icon(AwesomeIcon.STAR)
                        .size("2em")
                        .styleClass("stack-top")
                );

or by setting the style:

Region stackedIcon3 = AwesomeIconsStack.create()
                .add(Icon.create()
                        .icon(AwesomeIcon.SQUARE)
                        .style("-fx-font-size: 4em; -fx-text-fill: yellowgreen;"))
                .add(Icon.create()
                        .icon(AwesomeIcon.APPLE)
                        .style("-fx-font-size: 3em; -fx-text-fill: white;")
                );

fontawesomefx_8010_1

Thats the code to create Icons like above:

Region stackedIcon1 = AwesomeIconsStack.create().add(Icon.create());

Region stackedIcon2 = AwesomeIconsStack.create()
        .add(Icon.create()
                .icon(AwesomeIcon.SQUARE)
                .size("3em")
                .styleClass("stack-base"))
        .add(Icon.create()
                .icon(AwesomeIcon.STAR)
                .size("2em")
                .styleClass("stack-top")
        );

Region stackedIcon3 = AwesomeIconsStack.create()
        .add(Icon.create()
                .icon(AwesomeIcon.SQUARE)
                .style("-fx-font-size: 4em; -fx-text-fill: yellowgreen;"))
        .add(Icon.create()
                .icon(AwesomeIcon.APPLE)
                .style("-fx-font-size: 3em; -fx-text-fill: white;")
        );

Region stackedIcon4 = AwesomeIconsStack.create()
        .add(Icon.create()
                .icon(AwesomeIcon.SQUARE)
                .style("-fx-font-size: 4em; -fx-text-fill: yellowgreen;"))
        .add(Icon.create()
                .icon(AwesomeIcon.APPLE)
                .style("-fx-font-size: 3em; -fx-text-fill: black;")
        );

Region stackedIcon5 = AwesomeIconsStack.create()
        .add(Icon.create()
                .icon(AwesomeIcon.BUG)
                .style("-fx-font-size: 2em; -fx-text-fill: black;"))
        .add(Icon.create()
                .icon(AwesomeIcon.BAN)
                .style("-fx-font-size: 4em; -fx-text-fill: red; -fx-opacity: 0.5;")
        );

Region stackedIcon6 = AwesomeIconsStack.create()
        .add(Icon.create()
                .icon(AwesomeIcon.CIRCLE)
                .style("-fx-font-size: 8em; -fx-text-fill: linear-gradient(#70b4e5 0%, #247cbc 70%, #2c85c1 85%);"))
        .add(Icon.create()
                .icon(AwesomeIcon.TWITTER)
                .style("-fx-font-size: 4em; -fx-text-fill: white;")
        );

Region stackedIcon7 = AwesomeIconsStack.create()
        .add(Icon.create()
                .icon(AwesomeIcon.CIRCLE)
                .style("-fx-font-size: 12em; -fx-text-fill: linear-gradient(#70b4e5 0%, #247cbc 70%, #2c85c1 85%);"))
        .add(Icon.create()
                .icon(AwesomeIcon.BITBUCKET)
                .style("-fx-font-size: 6em; "
                        + "-fx-text-fill: linear-gradient(#ffffff, #d2d2d2); "
                        + "-fx-effect: dropshadow( one-pass-box , rgba(0,0,0,0.8) , 4 , 0.0 , 1 , 1 );")
        );

HBox stackIconBox = new HBox();
stackIconBox.setSpacing(5.0);
stackIconBox.getChildren().addAll(stackedIcon1, stackedIcon2, stackedIcon3, stackedIcon4, stackedIcon5, stackedIcon6, stackedIcon7);

Region iconStack1 = AwesomeIconsStack.create()
        .add(Icon.create()
                .icon(AwesomeIcon.CIRCLE)
                .style("-fx-font-size: 12em; -fx-text-fill: linear-gradient(#70b4e5 0%, #247cbc 70%, #2c85c1 85%);"))
        .add(Icon.create()
                .icon(AwesomeIcon.BITBUCKET)
                .style("-fx-font-size: 6em; "
                        + "-fx-text-fill: linear-gradient(#ffffff 0%, #d2d2d2); "
                        + "-fx-effect: dropshadow( one-pass-box , rgba(0,0,0,0.8) , 4 , 0.0 , 1 , 1 );"))
        .add(new Icon(AwesomeIcon.BAN, null, "-fx-font-size: 12em; -fx-text-fill: red; -fx-opacity: 0.5;", null));

HBox stackIconBox2 = new HBox();
stackIconBox2.setSpacing(5.0);
stackIconBox2.getChildren().addAll(iconStack1);

Have a look at “iconStack1” in the code above:
the number of stacked Icons is not limited to only two.

Support for FXML

In respect to the issue opened by Manuel Maukys (@manuel_mauky) I played with the new @NamedArg annotation. It’s also possible to use the Icon in FXML (even stacked):

fontawesomefx_8010_2

<VBox alignment="CENTER" spacing="10.0">
  <children>
    <Icon awesomeIcon="STAR" size="4em" style="-fx-font-size: 6em; -fx-text-fill: linear-gradient(#ffffff, #d2d2d2); -fx-effect: dropshadow( one-pass-box , rgba(0,0,0,0.5) , 8 , 0.0 , 0 , 0 );" styleClass="" />
    <StackPane>
      <children>
        <Icon awesomeIcon="CIRCLE" style="-fx-font-size: 24em; -fx-text-fill: linear-gradient(#70b4e5 0%, #247cbc 70%, #2c85c1 85%);" styleClass="" size=""/>
        <Icon awesomeIcon="BITBUCKET" style="-fx-font-size: 12em; -fx-text-fill: linear-gradient(#ffffff, #d2d2d2); -fx-effect: dropshadow( one-pass-box , rgba(0,0,0,0.8) , 4 , 0.0 , 1 , 1 );" styleClass="" size=""/>
      </children>
    </StackPane>
  </children>
</VBox>

I am not a Ninja master yet, but somehow I imported a custom component to get it also supported in SceneBuilder 2.0:

fontawesomefx_8010_3

Sep 13

MQTT.fx 0.0.9 released

A new version of MQTT.fx is available (probably the last release before JavaOne)

Download latest binaries in all flavours: mqttfx.org.
Bugs and feature requests can be reported via the issue tracker.

This release comes with some new features:

Message Font Size

(in respect to Gerrit Grunwald @hansolo_)
To improve ledibility of large message bodies now the font size of messages can be set to a fixed value (0.6em – 1.5em) or a dynamic size depending on message size (1.0em – 0.6em).
You can open the new Settings Dialog via Menu Extras / Settings:

settings

Dynamic message font size:

fonts

Clear History

(also in respect to Gerrit Grunwald)
The Connection Profile Dialog (Section “General”) and the Publish/Subscribe panels now the history of last topics can be cleared.

clear_publish

clear_sub

clear_profile

“Never again drive me crazy with silly questions”

(in respect to David Janes @dpjanes)
The Exit Dialog now offers an option “Do not ask me again!” to get not asked again when closing the app.

exit

Bugfixes

Also I again have fixed some bugs (typos, usability, layout + style issues).

Aug 28

FontAwesomeFX 8.0.9 with 40 new icons

I have updated FontAwesomeFX and released version 8.0.9.
A few days ago the FontAwesome 4.2.0 was released with 40 additional icons (FontAwesome now contains 479 icons).

Also I added a simple browser to preview all contained icons.
You can start it via: de.jensd.fx.fontawesome.test.IconOverview

iconsbrowser_8.0.9

Download Binaries
Sources @ Bitbucket

Maven Artifact:

<dependency>
  <groupId>de.jensd</groupId>
  <artifactId>fontawesomefx</artifactId>
  <version>8.0.9</version>
</dependency>