Multithreading 在JavaFX(嵌入javax.swing.JFrame)应用程序中运行无限循环
我试图在JavaFX应用程序中运行无限循环。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
在我的代码中,
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();
}
}
}