我正在制作一个带有切换按钮的 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 循环的条件永远不会改变,因为 ToggleButton
的 selectedProperty
永远不会改变,因为执行永远不会退出while循环。
您可以使用 Service
在后台线程上执行循环,以便 GUI 在循环运行时做出响应。 服务
可以是 canceled和 restarted .
示例
以下示例创建一个运行 Task
的 Service
,该任务执行 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/