java - 使用带有 while 循环的 ToggleButton JavaFX

标签 java javafx

我正在制作一个带有切换按钮的 JavaFX 应用程序。我想要一个 while 循环,只要按钮被切换就运行,并在按钮关闭时停止。现在在程序中,当我按下按钮时 while 循环会激活,但当我关闭按钮时循环不会停止。当我关闭按钮时,是否缺少一些东西来使循环停止?

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.ToggleButton;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;

public class Main extends Application{

    private BorderPane layout;
    private Scene scene;


    ToggleButton button = new ToggleButton("Button");
    AtomicBoolean running = new AtomicBoolean();

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage window) throws Exception {
        layout = new BorderPane();
        scene = new Scene(layout, 450, 80);



        button.setOnAction(e -> robot());

        layout.setCenter(button);


        window.setTitle("Desktop App");
        window.setScene(scene);
        window.show();

    }

    public void robot() {


        Map<Integer, Character> keyMap = new HashMap();

        running.set(button.isSelected());

        keyMap.put(1, 'a');
        keyMap.put(2, 'b');
        keyMap.put(3, 'c');
        keyMap.put(4, 'd');
        keyMap.put(5, 'e');
        keyMap.put(6, 'f');
        keyMap.put(7, 'g');
        keyMap.put(8, 'h');
        keyMap.put(9, 'i');
        keyMap.put(10, 'j');
        keyMap.put(11, 'k');
        keyMap.put(12, 'l');
        keyMap.put(13, 'm');
        keyMap.put(14, 'n');
        keyMap.put(15, 'o');
        keyMap.put(16, 'p');
        keyMap.put(17, 'q');
        keyMap.put(18, 'r');
        keyMap.put(19, 's');
        keyMap.put(20, 't');
        keyMap.put(21, 'u');
        keyMap.put(22, 'v');
        keyMap.put(23, 'w');
        keyMap.put(24, 'x');
        keyMap.put(25, 'y');
        keyMap.put(26, 'z');
        keyMap.put(27, ' ');
        keyMap.put(28, '0');
        keyMap.put(29, '1');
        keyMap.put(30, '2');
        keyMap.put(31, '3');
        keyMap.put(32, '4');
        keyMap.put(33, '5');
        keyMap.put(34, '6');
        keyMap.put(35, '7');
        keyMap.put(36, '8');
        keyMap.put(37, '9');

        if(running.get()) {
            while(running.get()) //Only runs when the button has been toggled
            {
                int randomInt = (int )(Math.random() * 37 + 1);
                System.out.println(keyMap.get(randomInt));

            }
        }


            //while button is toggled
                //choose random integer
                //map the random integer to a key on keyboard
                //Robot presses key on focused window
    }
}

最佳答案

在 FX 应用程序线程上运行 while 循环将阻止该线程,这意味着无法再与 GUI 进行交互。

while 循环的条件永远不会改变,因为 ToggleButtonselectedProperty 永远不会改变,因为执行永远不会退出while循环。

您可以使用 Service在后台线程上执行循环,以便 GUI 在循环运行时做出响应。 服务可以是 canceledrestarted .

示例

以下示例创建一个运行 TaskService,该任务执行 while 循环,直到 Service 获取取消。

我听selectedProperty的变化ToggleButton 的:

  • 如果选择:服务将重置并启动

  • 如果未选择:服务将被取消

代码

ToggleButton toggle = new ToggleButton();

Service<Void> toggleService = new Service<Void>() {

    @Override
    protected Task<Void> createTask() {

        return new Task<Void>(){

            @Override
            protected Void call() throws Exception {

                while(!isCancelled()) {
                    int randomInt = (int )(Math.random() * 37 + 1);
                    System.out.println(randomInt);
                }
                return null;
            }
        };
    }
};

toggle.selectedProperty().addListener((obs, oldVal, newVal) -> {
    if(newVal) {
        toggleService.reset();
        toggleService.start();
    }
    else 
        toggleService.cancel();

});

关于java - 使用带有 while 循环的 ToggleButton JavaFX,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39462321/

相关文章:

java - 将字符与正则表达式匹配

animation - javafx如何在弹出窗口上添加动画

tableview - javafx 准确显示表格 View 中单元格的文本

java - 无法对非静态字段 JAVAFX 进行静态引用

java - 无法在回调中赋值

java - 如何使用谷歌集合排序功能对 Java 中的值进行 Map<Key, Value> 排序

java - 如何替换已弃用的方法 Date.setHours(int)?

java - 在 super 构造函数运行之前初始化字段?

java - 我可以使用 TestFX 和 JUnit 测试舞台按钮或警报对话框吗?

javafx - 如何在JavaFX TableView中获取选定的TableCell