JavaFX:从线程更新ProgressBar(@FXML)
我想更新另一个类在FXML文件中定义的JavaFXProgressBar,该类在控制器线程中初始化。目前它只是不更新 test.fxmlJavaFX:从线程更新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() {
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));
}
}
考虑到以下帖子,我已经尝试了不同的版本:
@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)我想把这个例子尽量简短。