Multithreading 在JavaFX(嵌入javax.swing.JFrame)应用程序中运行无限循环

Multithreading 在JavaFX(嵌入javax.swing.JFrame)应用程序中运行无限循环,multithreading,javafx-2,infinite-loop,javafx-8,Multithreading,Javafx 2,Infinite Loop,Javafx 8,我试图在JavaFX应用程序中运行无限循环。 在我的代码中,Kulta.java文件中存在一个无限while循环。 这个循环实际上冻结了我的应用程序。 当我将应用程序移植到普通的javax.swing时,同样的事情也会发生。 现在,由于java.lang.Thread不适用于javafx,我加入了javafx.concurrent.Task, 这不是预期的工作。由于多线程的主要功能之一,即在GUI应用程序中运行无限循环,没有得到正确的服务,请帮助我解决此问题 这是我的代码: Urania.jav

我试图在JavaFX应用程序中运行无限循环。
在我的代码中,
Kulta.java
文件中存在一个无限while循环。
这个循环实际上冻结了我的应用程序。 当我将应用程序移植到普通的javax.swing时,同样的事情也会发生。
现在,由于
java.lang.Thread
不适用于javafx,我加入了
javafx.concurrent.Task
, 这不是预期的工作。由于多线程的主要功能之一,即在GUI应用程序中运行无限循环,没有得到正确的服务,请帮助我解决此问题

这是我的代码:

Urania.java

这是我的JFrame,我在其中嵌入了JavaFX应用程序

Kulta.java

import javax.swing.JFrame
导入javafx.embed.swing.JFXPanel;
导入javafx.application.Platform;
导入javafx.scene.scene;
导入javafx.scene.layout.BorderPane;
导入javafx.scene.control.Button;
导入javafx.event.ActionEvent;
导入javafx.event.EventHandler;
导入javafx.concurrent.Task;
公共类Kulta扩展JFrame{
私人JFXPanel;
私密场景;
私有边框窗格边框窗格;
私人按钮;
公共静态最终字符串INVOKE=“INVOKE”;
公共静态最终字符串中断=“中断”;
公共静态最终字符串[]颜色=新字符串[]{“黄色”、“粉色”、“绿色”、“蓝色”、“橙色”};
公共文化(){
fxpanel=新的JFXPanel();
添加(fxpanel);
Platform.runLater(
新的Runnable(){
@凌驾
公开募捐{
Kulta.this.setScene();
Kulta.this.setButton();
Kulta.this.setListener();
} 
}
);
}
私有空间{
borderpane=新的borderpane();
场景=新场景(边框窗格);
fxpanel.setScene(场景);
}
私有void setButton(){
按钮=新按钮(调用);
边框窗格。设置顶部(按钮);
}
私有void setListener(){
事件=新事件();
按钮设置动作(事件);
}
私有类事件实现EventHandler{
@凌驾
公共无效句柄(ActionEvent事件){
布尔标志=真;
Task onInvoke=新任务(){
@凌驾
公开作废通知(){
整数计数=0;
flag=true;
按钮设置文本(中断);
/*此循环将冻结应用程序*/
while(旗帜){
边框窗格.setStyle(“-fx颜色:“+颜色[计数]+”;”);
计数++;
if(count==COLORS.length)
计数=0;
}
返回null;
}
};
Task onInterrupt=新任务(){
@凌驾
公开作废通知(){
setText(调用);
国际单项体育联合会(旗)
flag=false;//这将停止onInvoke线程
返回null;
}
};
任务更改=新任务(){
@凌驾
公开作废通知(){
if(button.getText().equals(INVOKE))
onInvoke().run();
else if(button.getText().equals(中断))
onInterrupt().run();
}
};
change.run();
}
}
}  
我应该如何编写循环以避免应用程序冻结。
任何代码、解决方案、链接或任何形式的帮助都会大有帮助。

提前谢谢

你为什么说“
java.lang.Thread
不适合Javafx”@James\u D我试过了。代码可以编译。但是在运行时,它说它不是一个JavaFX线程。你不能从后台线程更新UI,但在几乎所有的UI工具包中都是这样。见本讨论:
import java.awt.Toolkit;
import java.awt.Dimension;
import javax.swing.SwingUtilities;
import static javax.swing.WindowConstants.EXIT_ON_CLOSE;



 public class Urania {

    public static final Dimension DIMENSION = Toolkit.getDefaultToolkit().getScreenSize();



    public static void main(String[] args) {

        SwingUtilities.invokeLater(

            new Runnable() { 

                @Override
                public void run() {

                     Kulta kulta = new Kulta();
                     kulta.setTitle("Abha K Pauri");
                     kulta.setSize(DIMENSION.width/2, DIMENSION.height/2);
                     kulta.setLocationRelativeTo(null);
                     kulta.setDefaultCloseOperation(EXIT_ON_CLOSE);
                     kulta.setVisible(true);
                }
            }
        );
    }
}  
import javax.swing.JFrame
import javafx.embed.swing.JFXPanel;
import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.scene.control.Button;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.concurrent.Task;



public class Kulta extends JFrame {

    private JFXPanel fxpanel;
    private Scene scene;
    private BorderPane borderpane;
    private Button button;



    public static final String INVOKE = "INVOKE";
    public static final String INTERRUPT = "INTERRUPT";
    public static final String[] COLORS = new String[]{"yellow", "pink", "green", "blue", "orange"};



    public Kulta() {

        fxpanel = new JFXPanel();
        add(fxpanel);

        Platform.runLater(

            new Runnable() {

                @Override
                public void run() {

                    Kulta.this.setScene();
                    Kulta.this.setButton();
                    Kulta.this.setListener();
                } 
            }
        );
    }



    private void setScene() {

        borderpane = new BorderPane();
        scene = new Scene(borderpane);
        fxpanel.setScene(scene);
    }



    private void setButton() {

        button = new Button(INVOKE);
        borderpane.setTop(button);
    }


    private void setListener() {

        Event event = new Event();
        button.setOnAction(event);
    }



    private class Event implements EventHandler<ActionEvent> {

        @Override
        public void handle(ActionEvent event) {

             boolean flag = true;


             Task<Void> onInvoke = new Task<Void>() {

                 @Override
                 public Void call() {

                     int count = 0;
                     flag = true;
                     button.setText(INTERRUPT);

                     /* This loop freezes the app. */
                     while(flag) {

                         borderpane.setStyle("-fx-color: "+COLORS[count]+";");
                         count++;

                         if(count == COLORS.length)
                             count = 0;
                     }

                     return null;
                 }
             };

             Task<Void> onInterrupt = new Task<Void>() {

                 @Override
                 public Void call() {

                     button.setText(INVOKE);

                     if(flag)
                         flag = false;    // This will stop the onInvoke thread

                     return null;                         
                 }
             };

             Task<Void> change = new Task<Void>() {

                 @Override
                 public Void call() {

                     if(button.getText().equals(INVOKE))
                         onInvoke().run();
                     else if(button.getText().equals(INTERRUPT))
                         onInterrupt().run();
                 }
             };


             change.run();
        }
    }
}