Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我能';t在For循环(JavaFX)中设置按钮文本_Java_For Loop_Javafx - Fatal编程技术网

我能';t在For循环(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

我被这个问题难住了。我必须在Java中可视化选择排序算法,我决定在UI中使用JavaFX。在我的代码中,我有数字数组和按钮数组。我用按钮一步一步地查看数字数组的输出。但我只在所有循环过程结束时得到输出结果。我想这样做:

我搜索了一下,知道我必须使用线程,但我无法处理它。你能帮帮我吗

@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”标记?