Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why use JavaFX properties?

Tags:

java

javafx

Pardon my question if it may seem stupid but I'm curious. I am making a program in Java of which will have a GUI, and am curious about the whole idea of properties. Why use them when we can just add data to a class? For example:

class myButton extends Button {

   private boolean booleanProperty = false;

   myButton(args...) {
      // Do something with the property
   }

   public void setProperty(boolean value) {
      this.booleanProperty = value;
   }

   public boolean getProperty() {
      return this.booleanProperty;
   }
}

Seems to work just fine for storing additional information on the custom implementation of the button. But what about:

class myButton extends Button {

   private SimpleBooleanProperty booleanProperty = new SimpleBooleanProperty(false);

   myButton(args...) {
      // Do something with the property
   }

   public void setProperty(boolean value) {
      this.booleanProperty.set(value);
   }

   public boolean getProperty() {
      return this.booleanProperty.get();
   }
}

The only real difference, I am seeing (correct me if I'm wrong) is that that you can attach listeners to the property values, but I feel as if there has to be more than just that. Ideas?

like image 560
WaffleMan0310 Avatar asked Dec 11 '22 14:12

WaffleMan0310


2 Answers

The power of JavaFX's properties is that they can be bound in ways that will automatically update the UI when a change occurs.

As an example consider an element you want to hide if a textField contains no value:

TextField tf = ...
Node container = ...
container.visibleProperty.bind(tf.textProperty.isNotEmpty());

Now as you change the text in tf, you will see container switching whether its visible based on the presence of text.

like image 124
Kiskae Avatar answered Dec 13 '22 02:12

Kiskae


They really are useful in a lot of ways I even started them using in non UI related stuff. But look at this example: You habe an undomanager class

public class UndoManager {
    BooleanProperty canUndo = ...;
    BooleanProperty canRedo = ...;

    ...
}

And you have 3 places from where you can invoke undo/redo.

MenuButton menuUndo;
Button toolbarUndo;
MenuButton contextMenuUndo;

You basically only beed to do this:

menuUndo.disabledProperty().bind(undoManager.undoProperty()):
toolbarUndo.disabledProperty().bind(undoManager.undoProperty());
contextMenuUndo.disabledProperty().bind(undoManager.undoProperty());

and you dont ever have to worry about it again. If you add a new place where an undo can happen you just have to bind it too.

like image 35
Jhonny007 Avatar answered Dec 13 '22 02:12

Jhonny007