MQTT.fx 0.0.10 released

MQTT.fx 0.0.10 was released.

Download latest binaries in all flavours at
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
Service menus at publish and subscription panel: now you can clear received messages buffer and the recent topics lists

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


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




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():


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.scene.Node.setDisable(

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());

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

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