Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFX:从线程更新ProgressBar(@FXML)_Java_Multithreading_Javafx_Fxml - Fatal编程技术网

JavaFX:从线程更新ProgressBar(@FXML)

JavaFX:从线程更新ProgressBar(@FXML),java,multithreading,javafx,fxml,Java,Multithreading,Javafx,Fxml,我想更新另一个类在FXML文件中定义的JavaFXProgressBar,该类在控制器线程中初始化。目前它只是不更新 test.fxml Controller.java @FXML public static ProgressBar progressBar = new ProgressBar(0); MyMain main; @FXML private void handleStartWork() throws Exception { new Thread() {

我想更新另一个类在FXML文件中定义的JavaFXProgressBar,该类在控制器线程中初始化。目前它只是不更新

test.fxml


Controller.java

@FXML
public static ProgressBar progressBar = new ProgressBar(0);

MyMain main;

@FXML
private void handleStartWork() throws Exception {
    new Thread() {
        @Override
        public void run() {
            try {
                main = new MyMain();
                main.doIt();
            } catch (final Exception v) {
                // ...
            }
        }
    }.start();
}
public void doIt(){
    while(...){
        Platform.runLater(() -> PoCOverviewController.progressBar.setProgress((count / sum) * 100));
    }
}
@FXML
public ProgressBar progressBar = new ProgressBar(0);    

private static Controller INSTANCE = new Controller();

public static Controller getInstance() {
    return INSTANCE;
}

public ProgressBar getProgressBar() {
    return progressBar;
}
public void doIt(){
    while(...){
        Platform.runLater(() -> Controller.getInstance().getProgressBar()
                .setProgress((count / sum) * 100));
    }
}
MyMain.java

@FXML
public static ProgressBar progressBar = new ProgressBar(0);

MyMain main;

@FXML
private void handleStartWork() throws Exception {
    new Thread() {
        @Override
        public void run() {
            try {
                main = new MyMain();
                main.doIt();
            } catch (final Exception v) {
                // ...
            }
        }
    }.start();
}
public void doIt(){
    while(...){
        Platform.runLater(() -> PoCOverviewController.progressBar.setProgress((count / sum) * 100));
    }
}
@FXML
public ProgressBar progressBar = new ProgressBar(0);    

private static Controller INSTANCE = new Controller();

public static Controller getInstance() {
    return INSTANCE;
}

public ProgressBar getProgressBar() {
    return progressBar;
}
public void doIt(){
    while(...){
        Platform.runLater(() -> Controller.getInstance().getProgressBar()
                .setProgress((count / sum) * 100));
    }
}
考虑到以下帖子,我已经尝试了不同的版本:

我不知道这是否是使ProgressBar保持静态的正确方法。我只是不想通过工作流传递对象

更新(Xavier Lambros回答): 现在我尝试了singleton,但仍然不起作用:

Controller.java

@FXML
public static ProgressBar progressBar = new ProgressBar(0);

MyMain main;

@FXML
private void handleStartWork() throws Exception {
    new Thread() {
        @Override
        public void run() {
            try {
                main = new MyMain();
                main.doIt();
            } catch (final Exception v) {
                // ...
            }
        }
    }.start();
}
public void doIt(){
    while(...){
        Platform.runLater(() -> PoCOverviewController.progressBar.setProgress((count / sum) * 100));
    }
}
@FXML
public ProgressBar progressBar = new ProgressBar(0);    

private static Controller INSTANCE = new Controller();

public static Controller getInstance() {
    return INSTANCE;
}

public ProgressBar getProgressBar() {
    return progressBar;
}
public void doIt(){
    while(...){
        Platform.runLater(() -> Controller.getInstance().getProgressBar()
                .setProgress((count / sum) * 100));
    }
}
MyMain.java

@FXML
public static ProgressBar progressBar = new ProgressBar(0);

MyMain main;

@FXML
private void handleStartWork() throws Exception {
    new Thread() {
        @Override
        public void run() {
            try {
                main = new MyMain();
                main.doIt();
            } catch (final Exception v) {
                // ...
            }
        }
    }.start();
}
public void doIt(){
    while(...){
        Platform.runLater(() -> PoCOverviewController.progressBar.setProgress((count / sum) * 100));
    }
}
@FXML
public ProgressBar progressBar = new ProgressBar(0);    

private static Controller INSTANCE = new Controller();

public static Controller getInstance() {
    return INSTANCE;
}

public ProgressBar getProgressBar() {
    return progressBar;
}
public void doIt(){
    while(...){
        Platform.runLater(() -> Controller.getInstance().getProgressBar()
                .setProgress((count / sum) * 100));
    }
}

我不认为你可以有一个静态的

我的方法是在控制器内的ProgressBar上有一个访问器,然后像这样初始化控制器:

FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/YourController.fxml");
loader.load();
之后,您可以通过以下方式访问ProgressBar:

loader.<YourController>getController().getProgressBar();
称之为:

Singleton.getInstance().getProgressBar();
如中所述,您不能创建带注释的字段
@FXML
-静态
(这样做没有意义:这些字段本质上是特定控制器实例的属性)

要允许
doIt()
方法访问进度条,可以直接将其作为参数传递:

@FXML
public ProgressBar progressBar ;

MyMain main;

@FXML
private void handleStartWork() throws Exception {
    new Thread() {
        @Override
        public void run() {
            try {
                main = new MyMain();
                main.doIt(progressBar);
            } catch (final Exception v) {
                // ...
            }
        }
    }.start();
}
然后

public void doIt(ProgressBar progressBar){
    while(...){
        Platform.runLater(() -> progressBar.setProgress((count / sum) * 100));
    }
}
在某些情况下,
Main
类依赖javafxapi可能没有意义。在这种情况下,您可以传递一个更新进度条的函数:

@FXML
public ProgressBar progressBar ;

MyMain main;

@FXML
private void handleStartWork() throws Exception {
    new Thread() {
        @Override
        public void run() {
            try {
                main = new MyMain();
                main.doIt(progressBar::setProgress);
            } catch (final Exception v) {
                // ...
            }
        }
    }.start();
}


请注意,您尚未显示
while
循环中发生的情况:如果您向FX应用程序线程提交了太多可运行程序,则可能会“淹没”它并阻止它在合理的时间内更新。您可以考虑使用具有特定API的A来更新进度栏,进度条的<代码>进度>代码>属性可以被绑定。如果它仍然不起作用,您应该编辑您的问题,使其包含一个。

那么有没有办法在MyMain.java类中调用“loader.getController().getProgressBar();”,因为没有FXMLLoader对象?请将MyMain.javaAs新手放在stackoverflow上,我无法直接评论您的问题。但是我认为你不能让你的控制器直接成为一个单体。Singleton应该是另一个类。FXML控制器是特定的,必须遵守一些规则。否则,我不明白为什么在MyMain中没有FXMLLoader,因为在javaFX项目中,MyMain应该包含场景初始化。。。不管怎么说,Singleton的想法是将设置的progressBar存储在控制器的init中,并使其在项目中的任何地方都可以访问。访问它时抛出Singleton,这是一种设计模式。我不想说显而易见的事情,但为什么不将进度条传递给
doIt()
方法:
main.doIt(progressBar)
公共无效doIt(ProgressBar ProgressBar){…()->ProgressBar.setProgress(…)}
?可能的@fabian副本从ProgressBar中删除了静态修饰符,但也不起作用。
计数
求和
整数
还是
s?那么下面的问题应该会有所帮助:@fabian实际上它们是不同的数据类型,但我已经在铸造它们了。(双倍计数/(双倍总和)*100)我想把这个例子尽量简短。