`

JavaFX学习之样例5

阅读更多
  该代码主要是timeline和进度条使用
import javafx.animation.*;
import javafx.application.Application;
import javafx.beans.property.*;
import javafx.beans.value.*;
import javafx.event.*;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.scene.text.Text;
import javafx.stage.Stage;
import javafx.util.Duration;

public class LabeledProgressBarSample extends Application {
  public static void main(String[] args) { launch(args); }

  @Override public void start(final Stage stage) {
    stage.setScene(new Scene(createResettableProgressIndicatorBar()));
    stage.show();
  }

  private VBox createResettableProgressIndicatorBar() {
    final int    TOTAL_WORK = 18;
    final String WORK_DONE_LABEL_FORMAT = "%.0f";

    final ReadOnlyDoubleWrapper workDone  = new ReadOnlyDoubleWrapper();

    final ProgressIndicatorBar bar = new ProgressIndicatorBar(
        workDone.getReadOnlyProperty(),
        TOTAL_WORK,
        WORK_DONE_LABEL_FORMAT
    );

    final Timeline countDown = new Timeline(
        new KeyFrame(Duration.seconds(0), new KeyValue(workDone, TOTAL_WORK)),  //初始化workDone等于total,也就是进度条满的
        new KeyFrame(Duration.seconds(10), new KeyValue(workDone, 0))           //10秒内把workDone减到0。
    );
    countDown.play();

    final Button resetButton = new Button("Reset");
    resetButton.setOnAction(new EventHandler<ActionEvent>() {
      @Override
      public void handle(ActionEvent actionEvent) {
        countDown.playFromStart();  //重新开始
      }
    });

    final VBox layout = new VBox(20);
    layout.setAlignment(Pos.CENTER);
    layout.setStyle("-fx-background-color: cornsilk; -fx-padding: 20px;");
    layout.getChildren().addAll(bar, resetButton);

    return layout;
  }
}

class ProgressIndicatorBar extends StackPane {
  final private ReadOnlyDoubleProperty workDone;
  final private double totalWork;

  final private ProgressBar bar  = new ProgressBar();
  final private Text        text = new Text();
  final private String      labelFormatSpecifier;

  final private static int DEFAULT_LABEL_PADDING = 5;

  ProgressIndicatorBar(final ReadOnlyDoubleProperty workDone, final double totalWork, final String labelFormatSpecifier) {
    this.workDone  = workDone;
    this.totalWork = totalWork;
    this.labelFormatSpecifier = labelFormatSpecifier;

    syncProgress();
    //监听workDone的变化,从而更新text和progress
    workDone.addListener(new ChangeListener<Number>() {
      @Override public void changed(ObservableValue<? extends Number> observableValue, Number number, Number number2) {
        syncProgress();
      }
    });

    bar.setMaxWidth(Double.MAX_VALUE); // allows the progress bar to expand to fill available horizontal space.

    getChildren().setAll(bar, text);
  }

  // synchronizes the progress indicated with the work done.
  private void syncProgress() {
    if (workDone == null || totalWork == 0) {
      text.setText("");
      bar.setProgress(ProgressBar.INDETERMINATE_PROGRESS);
    } else {
      text.setText(String.format(labelFormatSpecifier, Math.ceil(workDone.get())));  //更新text
      bar.setProgress(workDone.get() / totalWork);  //更新进度条
    }

    bar.setMinHeight(text.getBoundsInLocal().getHeight() + DEFAULT_LABEL_PADDING * 2);
    bar.setMinWidth (text.getBoundsInLocal().getWidth()  + DEFAULT_LABEL_PADDING * 2);
  }
}

代码主要也就是timeline和progress二个的用法。fx最好的就是多了property,property里面多了方法。如上面的ReadOnlyDoubleWrapper,可以监控其值得变化。

String.format(labelFormatSpecifier, Math.ceil(workDone.get()));学习到了一个格式转化。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics