【问题标题】: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 也可用。

    示例程序输出:

    【讨论】:

    • 这正是我想要的。谢谢你:)
    猜你喜欢
    • 1970-01-01
    • 2014-10-12
    • 1970-01-01
    • 1970-01-01
    • 2011-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多