【问题标题】:Draw a String onto a ProgressBar, like JProgressBar?在 ProgressBar 上绘制一个字符串,例如 JProgressBar?
【发布时间】:2012-12-13 03:02:05
【问题描述】:
我最近开始使用 JavaFX,并开始制作自定义 Swing 组件的 FX 版本。其中之一是倒计时计时器,其中涉及JProgressBar。我会使用setString(String) 方法将当前时间绘制到条形图上。不幸的是,JavaFX 的ProgressBar 似乎没有这样的方法。我看到的最接近我正在寻找的东西是:
(source)
我不知道这是否需要一个全新的自定义组件,或者只需要一个像 java.awt.Graphics 这样的类。
任何帮助将不胜感激。谢谢:)
【问题讨论】:
标签:
java
string
progress-bar
javafx
jprogressbar
【解决方案1】:
这是一个示例,(我认为)可以满足您的问题。
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);
}
}
complete executable test harness 也可用。
示例程序输出: