Binding Properties

Binding Properties

---------------- Binding.java ------------------

import javafx.application.*;
import javafx.stage.*;
import javafx.scene.*;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.scene.effect.*;
import javafx.scene.canvas.*;
import javafx.scene.shape.*;
import javafx.scene.paint.*;
import javafx.scene.chart.NumberAxis;
import javafx.beans.property.*;
import javafx.geometry.*;

public class Binding extends Application {

  double lastX, lastY;

  @Override
  public void start(Stage stage) {
    BorderPane layout = new BorderPane();
    Scene scene = new Scene(layout, 500, 300);
    stage.setScene(scene);
    Slider slider = new Slider(0, 1, 0);
    slider.setMinWidth(150);
    slider.setMaxWidth(150);
    slider.setPadding(new Insets(6));
    slider.setBlockIncrement(0.05);
    Tank1 tank1 = new Tank1(150, 200, 30, 15);
    tank1.levelProperty().bind(slider.valueProperty());
    tank1.setOnMousePressed(me -> {
      lastX = me.getX();
      lastY = me.getY();
    });
    tank1.setOnMouseDragged(me -> {
      double layoutX = tank1.getLayoutX() + me.getX() - lastX;
      double layoutY = tank1.getLayoutY() + me.getY() - lastY;
      if (layoutX >= 0) tank1.setLayoutX(layoutX);
      if (layoutY >= 0) tank1.setLayoutY(layoutY);
    });
    layout.setCenter(new ScrollPane(new Pane(tank1)));
    layout.setBottom(slider);
    stage.show();
  }

  public class Tank1 extends Group {
    private double w, h, a, s;
    private NumberAxis tickLine;
    private Rectangle bar;
    private Canvas canvas;
    private DoubleProperty levelProperty = new SimpleDoubleProperty(this, "level", 0.0);

    public Tank1(double w, double h, double a, double s) {
      this.w = w;
      this.h = h;
      this.a = a;
      this.s = s;
      levelProperty.addListener(observable -> { updateLevel(); });
      tickLine = new NumberAxis(0, 100, 10);
      tickLine.setSide(Side.RIGHT);
      tickLine.setPrefHeight(h - a - a);
      tickLine.setMinHeight(StackPane.USE_PREF_SIZE);
      tickLine.setMaxHeight(StackPane.USE_PREF_SIZE);
      tickLine.setLayoutX(w / 2);
      tickLine.setLayoutY(a);
      bar = new Rectangle(w / 2 - s - 5, h - a, s, 0);
      bar.setFill(Color.BLUE);
      canvas = new Canvas(w, h);
      bg();
      getChildren().addAll(canvas, bar, tickLine);
    }

    private void updateLevel() {
      double barHeight = Math.round((h - a - a) * levelProperty.get());
      bar.setLayoutY(-barHeight);
      bar.setHeight(barHeight);
    }

    private void bg() {
      GraphicsContext gc = canvas.getGraphicsContext2D();
      gc.beginPath();
      gc.moveTo(0, a);
      gc.quadraticCurveTo(0, 0, w / 2, 0);
      gc.quadraticCurveTo(w, 0, w, a);
      gc.lineTo(w, h - a);
      gc.quadraticCurveTo(w, h, w / 2, h);
      gc.quadraticCurveTo(0, h, 0, h - a);
      gc.closePath();
      gc.setFill(Color.WHITESMOKE);
      gc.fill();
      InnerShadow shade = new InnerShadow();
      shade.setWidth(w * 2);
      shade.setHeight(h / 4);
      shade.setColor(Color.BLACK);
      gc.applyEffect(shade);
      gc.setStroke(Color.DARKGRAY);
      gc.strokeRect(w / 2 - s - 5, a, s, h - a - a);
    }

    public DoubleProperty levelProperty() { return levelProperty; }
  }
}

Download ZIP

Back