使用 JavaFX UI 控件的 ProgressIndicator 时,如何避免显示百分比值

How can I avoid the display of percentage values, when using the ProgressIndicator of JavaFX UI Controls

我是 Java 的新手,想去掉 Java FX 中 ProgressIndicator 的显示百分比值。有没有办法禁用值显示?我检查了 documentation,但据我所知并没有找到正确的方法。 谢谢你的帮助!!

编辑文本值

由于用于显示进度值的 Text 节点隐藏在 ProgressIndicatorSkin class 的内部 class 中,访问它的最佳方法是使用查找,试图通过它的样式找到这个节点class percentage.

此代码段只会删除 % 字符。

private Text lookup;

@Override
public void start(Stage primaryStage) {
    final Group root = new Group();
    final ProgressIndicator indicator = new ProgressIndicator();

    root.getChildren().add( indicator );
    final Scene scene = new Scene( root );

    final Task<Void> task = new Task<Void>() {
        @Override
        protected Void call() throws Exception {

            IntStream.range(0, 1000).forEach( i ->{
                updateProgress( i, 1000 );
                try{ Thread.sleep(10); } catch(InterruptedException ie){}
            });

            return null;
        }
    };

    indicator.progressProperty().bind( task.progressProperty() );
    new Thread( task ).start();

    primaryStage.setTitle("Hello World!");
    primaryStage.setScene(scene);
    primaryStage.show();

    indicator.progressProperty().addListener((obs,n,n1)->{
        if(lookup==null){
            lookup= (Text)root.lookup(".percentage");
        }
        lookup.setText(lookup.getText().replace("%", ""));
    });         
}

删除文本值

一个完全不同的问题是摆脱 Text 节点。

有一个名为 doneText 的静态 Text

is just used to know the size of done as that is the biggest text we need to allow for

因此对 lookup 节点的任何更改都不会影响整个控件的边界框。

此外,鉴于 Text 节点是 Region 的子节点,子列表不可修改。

所以我想出的解决方法就是剪掉指标。

private Text lookup;
@Override
public void start(Stage primaryStage) {
    final VBox root = new VBox();

    final ProgressIndicator indicator = new ProgressIndicator();
    root.getChildren().addAll( new Group(indicator), new Button("Some Button") );
    final Scene scene = new Scene( root );

    final Task<Void> task = new Task<Void>() {
        @Override
        protected Void call() throws Exception {

            IntStream.range(0, 1_000).forEach( i ->{
                updateProgress( i, 1_000 );
                try{ Thread.sleep(10); } catch(InterruptedException ie){}
            });

            return null;
        }
    };

    indicator.widthProperty().addListener((obs,d,d1)->{
        if(d.doubleValue()>0){
            // Clip the indicator
            Rectangle clip=new Rectangle(d1.doubleValue(),d1.doubleValue());
            indicator.setClip(clip);
        }
    });
    indicator.progressProperty().bind( task.progressProperty() );

    primaryStage.setTitle("Hello World!");
    primaryStage.setScene(scene);
    primaryStage.show();
    new Thread( task ).start();

}

现在我们可以正确布局其他控件了。

通过向-16添加填充来解决它....