【问题标题】:How to configure Progress Bar and Progress Indicator of javaFx?如何配置javaFx的进度条和进度指示器?
【发布时间】:2013-06-14 13:17:34
【问题描述】:

我正在尝试在我的页面上添加一个滑块,例如进度条。但是我的代码运行不好。

我的任务是当我要将某些内容从一个位置复制到另一个位置时,我想在我的页面上显示一个进度条。
因此,在 javaFx 中,我编写了以下任务,但效果不佳。该代码运行,但我想以百分比显示工作,如 30%、50% 和“完成”。但是我的代码没有给我这样的要求,所以请帮助我。

我的代码是:

1.进度条和进度指示器的声明

@FXML
final ProgressBar progressBar = new ProgressBar();
@FXML
final ProgressIndicator progressIndicator = new ProgressIndicator();

2.当我点击复制按钮时赋值。

@FXML
private void handleOnClickButtonAction(MouseEvent event) {
    if (fromLabel.getText().isEmpty()
            || toLabel.getText().isEmpty()
            || fromLabel.getText().equalsIgnoreCase("No Directory Selected")
            || toLabel.getText().equalsIgnoreCase("No Directory Selected")) {
        // Nothing
    } else {
        progressBar.setProgress(0.1f);
        progressIndicator.setProgress(progressBar.getProgress());
        this.directoryCount.setText("Please Wait !!!");
    }
}

这段代码只显示了 10% 的完成,然后直接显示“完成”,但我想要整个过程的百分比,如 10、20、30 等,然后“完成”。


我的复制代码:

double i = 1;
while (rst.next()) {
    File srcDirFile = new File(fromLabel.getText() + "/" + rst.getString("nugget_media_files"));
    File dstDirFile = new File(toLabel.getText() + "/" + rst.getString("nugget_media_files"));
    File dstDir = new File(toLabel.getText() + "/" + rst.getString("nugget_directory"));
    if (srcDirFile.lastModified() > dstDirFile.lastModified()
            || srcDirFile.length() != dstDirFile.length()) {
        copyDirectory(srcDirFile, dstDirFile, dstDir);
    }

    this.currentNuggetCount = i / this.nuggetFolderSize;

    System.out.println("Nugget Count : " + this.currentNuggetCount);

    Platform.runLater(new Runnable() {
        @Override
        public void run() {
            progressBar.setProgress(1.0f);
            progressIndicator.setProgress(progressBar.getProgress());
        }
    });

    ++i;
}

这是copyDirectory 方法:

private static void copyDirectory(File srcDir, File dstDir,File destNugget) {
    System.out.println(srcDir+" >> "+dstDir);
    if(!destNugget.exists()) {
        destNugget.mkdirs();
    }

    if (srcDir.isDirectory()) {
        if (!dstDir.exists()) {
            dstDir.mkdirs();
        }

        String[] children = srcDir.list();
        for (int i=0; i<children.length; i++) {
            copyDirectory(new File(srcDir, children[i]),
                          new File(dstDir, children[i]),
                          destNugget);
        }
    } else {
        InputStream in = null;
        try {
            in = new FileInputStream(srcDir);
            OutputStream out = new FileOutputStream(dstDir);
            byte[] buf = new byte[1024];
            int len;
            while ((len = in.read(buf)) > 0) {
                out.write(buf, 0, len);
            }
            in.close();
            out.close();
        } catch (IOException ex) {
            System.out.println("Exceptio "+ex);
        } finally {
            try {
                in.close();
            } catch (IOException ex) {
                System.out.println("Exceptio "+ex);
            }
        }
    }
}

【问题讨论】:

  • 您应该从复制程序更新ProgressBar。你用什么代码来复制?

标签: java javafx progress-bar


【解决方案1】:

试试这个代码。它将为您提供带有进度指示器的进度条,该进度指示器取决于滑块控件。

public class Main  extends Application {

    @Override
    public void start(Stage stage) {
        Group root = new Group();
        Scene scene = new Scene(root);
        stage.setScene(scene);
        stage.setTitle("Progress Controls");

        final Slider slider = new Slider();
        slider.setMin(0);
        slider.setMax(50);

        final ProgressBar pb = new ProgressBar(0);
        final ProgressIndicator pi = new ProgressIndicator(0);

        slider.valueProperty().addListener(new ChangeListener<Number>() {
            public void changed(ObservableValue<? extends Number> ov,
                Number old_val, Number new_val) {
                pb.setProgress(new_val.doubleValue()/50);
                pi.setProgress(new_val.doubleValue()/50);
            }
        });

        final HBox hb = new HBox();
        hb.setSpacing(5);
        hb.setAlignment(Pos.CENTER);
        hb.getChildren().addAll(slider, pb, pi);
        scene.setRoot(hb);
        stage.show();
    }
    public static void main(String[] args) {
        launch(args);
    }
}

【讨论】:

    【解决方案2】:

    您必须在 Task 中输入代码并在 UpdateProgress 方法中进行设置。在你运行Task之前你必须设置progressBar.progressProperty()。绑定(task.progressProperty());

    这是一个例子: TaskTest

    【讨论】:

      猜你喜欢
      • 2018-03-14
      • 1970-01-01
      • 1970-01-01
      • 2018-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      相关资源
      最近更新 更多