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)

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>

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.