有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java我无法在For循环(JavaFX)中设置按钮文本

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

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

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

}

共 (2) 个答案

  1. # 1 楼答案

    But I only get output result when all the loop process ends

    这是因为您在Thread上调用了run(),所以它实际上不会创建新线程。相反,它在主UI线程上运行,从不允许UI更新

    我认为多线程并不是一个很好的解决方案,因为您必须弄清楚如何与UI线程通信以通知它进行更新。很多年前,当我在Swing中做类似的事情时,我在排序算法中使用回调来通知UI进行更新

  2. # 2 楼答案

    下面是交换一行中的Label数组中的两个Labelmre。 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();
        }
    }