在JavaFX中运行无限循环(嵌入在javax.swing.JFrame中)App

时间:2014-09-04 19:18:39

标签: multithreading javafx-2 infinite-loop javafx-8

我正在尝试在我的JavaFX应用程序中运行无限循环 我的代码中Kulta.java文件中存在无限循环 这个循环实际上冻结我的应用程序。 当我将应用程序移植到普通的javax.swing时,同样的事情也适用 既然java.lang.Thread对javafx不起作用,我来到了javafx.concurrent.Task, 这不符合预期。作为多线程的主要功能之一,即在GUI应用程序中运行无限循环,无法正常使用,请帮助我解决方案。

这是我的代码:

Urania.java

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);
                }
            }
        );
    }
}  

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

Kulta.java

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();
        }
    }
}  

我应该如何编写循环以免让应用程序冻结 任何形式的代码,解决方案,链接或任何帮助都会有很大帮助 提前致谢。

0 个答案:

没有答案