将一个字符串绘制到ProgressBar上,就像JProgressBar一样?

mat*_*ean 8 java string javafx jprogressbar progress-bar

我最近开始使用JavaFX,并开始制作我的自定义Swing组件的FX版本.其中一个是倒计时器,其中JProgressBar涉及一个.我会使用它的setString(String)方法将当前时间绘制到条形图上.不幸的是,JavaFX似乎没有这样的方法ProgressBar.我看到的最接近我正在寻找的是:

计时器 (来源)

我不知道这是否需要一个全新的自定义组件,或者只是一个类java.awt.Graphics.

任何帮助将非常感激.谢谢 :)

jew*_*sea 14

这是一个样本(我认为)做了你的问题.

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.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())));
      bar.setProgress(workDone.get() / totalWork);
    }

    bar.setMinHeight(text.getBoundsInLocal().getHeight() + DEFAULT_LABEL_PADDING * 2);
    bar.setMinWidth (text.getBoundsInLocal().getWidth()  + DEFAULT_LABEL_PADDING * 2);
  }
}
Run Code Online (Sandbox Code Playgroud)

一个完整的可执行测试工具也可以.

示例程序输出:

labeledprogressbar