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

时间:2015-03-05 12:26:12

标签: javafx javafx-8 fxml scenebuilder

我对Java很陌生,想要摆脱Java FX中显示的ProgressIndicator百分比值。是否有禁用值显示的方法?我检查了documentation,但据我所知,找不到合适的方法。 谢谢你的帮助!!

2 个答案:

答案 0 :(得分:2)

编辑文字值

由于用于显示进度值的Text节点隐藏在ProgressIndicatorSkin类的内部类中,因此访问它的最佳方法是使用查找,尝试通过其类型查找此节点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节点。

有一个名为Text的静态doneText

  

只是用来知道完成的大小,因为这是我们需要允许的最大文本

因此对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();

}

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

clipped indicator

答案 1 :(得分:0)

通过在-16 ...处添加填充权来解决该问题。