我最近开始使用 JavaFX,并开始制作自定义 Swing 组件的 FX 版本。其中之一是倒计时计时器,其中JProgressBar
涉及 a。setString(String)
我会使用它的方法将当前时间绘制到条上。不幸的是,JavaFX 的ProgressBar
. 我看到的最接近我正在寻找的东西是:
(来源)
我不知道这是否需要一个全新的自定义组件,或者只是一个像java.awt.Graphics
.
任何帮助将非常感激。谢谢 :)
我最近开始使用 JavaFX,并开始制作自定义 Swing 组件的 FX 版本。其中之一是倒计时计时器,其中JProgressBar
涉及 a。setString(String)
我会使用它的方法将当前时间绘制到条上。不幸的是,JavaFX 的ProgressBar
. 我看到的最接近我正在寻找的东西是:
(来源)
我不知道这是否需要一个全新的自定义组件,或者只是一个像java.awt.Graphics
.
任何帮助将非常感激。谢谢 :)
这是一个示例(我认为)可以满足您的问题。
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);
}
}
还提供完整的可执行测试工具。
示例程序输出: