我能';t在For循环(JavaFX)中设置按钮文本
我被这个问题难住了。我必须在Java中可视化选择排序算法,我决定在UI中使用JavaFX。在我的代码中,我有数字数组和按钮数组。我用按钮一步一步地查看数字数组的输出。但我只在所有循环过程结束时得到输出结果。我想这样做: 我搜索了一下,知道我必须使用线程,但我无法处理它。你能帮帮我吗我能';t在For循环(JavaFX)中设置按钮文本,java,for-loop,javafx,Java,For Loop,Javafx,我被这个问题难住了。我必须在Java中可视化选择排序算法,我决定在UI中使用JavaFX。在我的代码中,我有数字数组和按钮数组。我用按钮一步一步地查看数字数组的输出。但我只在所有循环过程结束时得到输出结果。我想这样做: 我搜索了一下,知道我必须使用线程,但我无法处理它。你能帮帮我吗 @FXML private void btnTik(ActionEvent event){ Action action = new Action(); new Thread(){ pu
@FXML
private void btnTik(ActionEvent event){
Action action = new Action();
new Thread(){
public void run(){
for(int i = 0 ; i < nums.length ; i++){
min = i;
for(int j = i+1 ; j < nums.length ; j++){
if(nums[j] < nums[min]){
min = j;
btn[i].setText(Integer.toString(nums[i]));
action.sleep(200); //Thead.sleep(200)
}
btn[i].setText(Integer.toString(nums[i]));
action.sleep(200);
}
nums = action.Degistir(nums, i, min);
btn[i].setText(Integer.toString(nums[i]));
action.sleep(200);
System.out.println(nums[i]+" ");
}
}
}.run();
}
@FXML
私有void btnTik(ActionEvent事件){
动作动作=新动作();
新线程(){
公开募捐{
对于(int i=0;i
但我只在所有循环过程结束时得到输出结果
这是因为您在线程上调用run()
,因此它实际上不会创建新线程。相反,它在主UI线程上运行,从不允许UI更新
我认为多线程并不是一个很好的解决方案,因为您必须弄清楚如何与UI线程通信以通知它进行更新。许多年前,当我在Swing中做了类似的事情时,我在排序算法中使用回调来通知UI进行更新。下面是一个交换两个标签的过程,一行中的标签数组。
JavaFx动画工具是适合这项工作的工具。本例使用了PauseTransition
:
import java.util.Random;
import javafx.animation.PauseTransition;
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.GridPane;
import javafx.scene.text.Font;
import javafx.stage.Stage;
import javafx.util.Duration;
public class FxMain extends Application {
@Override
public void start(Stage primaryStage) {
primaryStage.setScene(new Scene(new ReelPane()));
primaryStage.show();
}
public static void main(String[] args) {
launch(null);
}
}
class ReelPane extends GridPane {
private final Label[] tiles;
private static final int PAUSE = 3, NUM_OF_TILES = 5;
ReelPane() {
tiles = new Label[NUM_OF_TILES];
setPadding(new Insets(5));
setHgap(10);
setVgap(10);
for(int index = 0; index < NUM_OF_TILES; index++){
Label tile = new Label(String.valueOf(index));
tile.setPrefSize(100,100);
tile.setStyle("-fx-border-color: red;");
tile.setFont(new Font("Arial", 30));
tile.setAlignment(Pos.CENTER);
tiles[index]=tile;
add(tile, index, 0);
}
swap();
}
public void swap() {
Random rand = new Random();
PauseTransition pause = new PauseTransition(Duration.seconds(PAUSE));
pause.setOnFinished(event ->{
int index1 = rand.nextInt(NUM_OF_TILES);
int index2 = rand.nextInt(NUM_OF_TILES);
if(index1 != index2){
String tempText = tiles[index1].getText();
tiles[index1].setText(tiles[index2].getText());
tiles[index2].setText(tempText);
}
pause.play();
});
pause.play();
}
}
import java.util.Random;
导入javafx.animation.PauseTransition;
导入javafx.application.application;
导入javafx.geometry.Insets;
导入javafx.geometry.Pos;
导入javafx.scene.scene;
导入javafx.scene.control.Label;
导入javafx.scene.layout.GridPane;
导入javafx.scene.text.Font;
导入javafx.stage.stage;
导入javafx.util.Duration;
公共类FxMain扩展了应用程序{
@凌驾
公共无效开始(阶段primaryStage){
setScene(新场景(新卷轴窗格());
primaryStage.show();
}
公共静态void main(字符串[]args){
发射(空);
}
}
类ReelPane扩展了GridPane{
私人最终标签[]瓷砖;
私有静态最终整数暂停=3,分片数=5;
卷轴窗格(){
瓷砖=新标签[瓷砖数量];
设置填充(新插图(5));
setHgap(10);
setVgap(10);
对于(int index=0;index{
int index1=rand.nextInt(瓷砖数量);
int index2=rand.nextInt(瓷砖数量);
如果(index1!=index2){
String testext=tiles[index1].getText();
平铺[index1].setText(平铺[index2].getText());
tiles[index2].setText(testext);
}
暂停。玩();
});
暂停。玩();
}
}
一些问题:(1)请参阅。(2) 如果你解决了第一个问题,那么你将在后台线程上更新UI;永远不要这样做,只有在FX线程上才能与实时UI交互。(3) 我不相信你需要一个线程,动画API应该是足够的;请看。谢谢,但我仍然不明白如何将其用于嵌套for循环(我的意思是将我的循环替换为动画)请看和*我决定使用JavaFX*-那么为什么要包含“Swing”标记?