Я не могу установить текст кнопки для L oop (JavaFX) - PullRequest
0 голосов
/ 22 апреля 2020

Я застрял в этой проблеме. Я должен визуализировать алгоритм выбора сортировки в Java, я решил использовать JavaFX для пользовательского интерфейса. В моем коде у меня есть массив чисел и массив кнопок. Я использовал кнопки, чтобы шаг за шагом увидеть вывод массива чисел. Но я получаю результат только тогда, когда весь процесс l oop заканчивается. Я хочу сделать это, как в этом примере: 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 голос
/ 22 апреля 2020

Ниже приведено mre обмена двух Label с в массиве Label с подряд. Инструменты анимации 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();
    }
}
0 голосов
/ 22 апреля 2020

Но я получаю результат вывода только тогда, когда весь процесс l oop заканчивается

Это потому, что вы вызываете run() на Thread, поэтому он на самом деле не создает новая тема. Вместо этого он работает в основном потоке пользовательского интерфейса и никогда не позволяет обновлять пользовательский интерфейс.

Я думаю, что многопоточность не является хорошим решением для того, что вы хотите сделать, потому что вам придется выяснить, как взаимодействовать с UI поток, чтобы сказать, чтобы обновить. Когда я много лет делал что-то подобное в Swing go, я использовал обратные вызовы в своем алгоритме сортировки, чтобы дать понять интерфейсу обновления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...