JavaFx가 while 루프에서 멈춤

늑대 변경

JavaFx를 처음 사용하고 행맨 게임을 코딩하려고합니다. 내 어휘를 보유한 파일이 있는지 확인해야하는 시점에 있습니다. 사용자에게 위치를 입력하도록 요청하지 않는 경우. 사용자에게 위치를 입력하고 버튼을 누르라는 팝업 창에서이 작업을 수행하려고합니다.이 버튼을 누르면 textbox.getText ()가 저장되고로드됩니다. 위치가 잘못된 경우 반복합니다. . 이 팝업을 실행하기 위해 의도적으로 위치를 잘못 입력했지만 while 루프에 갇혀 앱을 종료해야합니다. 나는 그것을 새로운 씬으로 실행하고 있지만 다음에 무엇을 해야할지 고민하고 있습니다. 여기 내 Controller.java가 있습니다.

참고 : 이것은 대학의 숙제이지만 등록하지 않았습니다. 나는 장애가 있고 친구가 수업을 듣고 있습니다. 나는 그의 과제를 가지고 놀면서 바쁘게 지내려고 노력하고있다. 코딩에 대한 사랑은 저를 바쁘고 최신 상태로 유지하며 새로운 것을 배우게됩니다.

package sample;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.VBox;
import javafx.stage.Modality;
import javafx.stage.Stage;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;


public class Controller {

    public Label welcomeLabel, guessesLettersLabel, GuessesRemainingLabel, currentStateLAbel, endGameMessageLabel;
    public Button newGameButton, exitButton, enterTextButton;
    public TextField enterTextBox;
    public boolean ynAnswer;
    public String textAnswer;
    Stage window;
    File inputFile;


    public void newGame() throws FileNotFoundException {

        Scanner input = new Scanner(System.in);

        inputFile = new File("src\\sample\\HangmanLexcon.txt");
        while(!inputFile.exists()) {
            window = new Stage();
            window.initModality(Modality.APPLICATION_MODAL);
            window.setTitle("File was not found.");
            window.setMinWidth(250);
            window.setMaxHeight(100);

            //form
            TextField fileInput = new TextField();
            Button inputButton = new Button("Upload File");
            inputButton.setOnAction(e -> {
                inputFile = new File(fileInput.getText());
                window.close();
            });


            //Layout
            VBox layout = new VBox(10);
            layout.setPadding(new Insets(20, 20, 20, 20));
            layout.getChildren().addAll(fileInput, inputButton);

            //Set scene and show in window.
            Scene scene = new Scene(layout, 300, 100);
            window.setScene(scene);
            window.show();

        }

        Hangman newGame = new Hangman(inputFile.toString());
        welcomeLabel.setText("A word has been selected. Good luck, and may the odds ever be in your favor.");

        guessesLettersLabel.setText("Guessed Letters: " + newGame.getGuessedLetters());
        GuessesRemainingLabel.setText("Guesses remaining: " + newGame.getIncorrectGuessesRemaining());
        currentStateLAbel.setText("Current State: " + newGame.getCurrentState());

    }

    public void enterTextButton(){
        System.out.println("You pressed enter...");
    }

    public void enterText(){
        enterTextButton();
    }

    /**
     * If the player closed to exit the game or hit the X button this method will ask if they are
     * sure they wish to exit before quiting the game.
     */
    public void exitGame(){
        Boolean answer = desplayYesNoMessgae("Exit", "Are you sure you want to exit?");
        if(answer)
            System.exit(0);
    }

    public boolean desplayYesNoMessgae(String title, String message){
        Stage window = new  Stage();
        window.initModality(Modality.APPLICATION_MODAL);
        window.setTitle(title);
        window.setMinWidth(250);
        Label label1 = new Label();
        label1.setText(message);

        //Create two buttons, yes and no
        Button yesButton = new Button("Yes");
        Button noButton = new Button("No");

        //If yes ic clucked, set answer to true.
        yesButton.setOnAction(e -> {
            ynAnswer = true;
            window.close();
        });

        //if no is clicked, set answer to false.
        noButton.setOnAction(e -> {
            ynAnswer =  false;
            window.close();
        });

        VBox layout = new VBox(10);
        layout.getChildren().addAll(label1, yesButton, noButton);
        layout.setAlignment(Pos.CENTER);
        Scene scene = new Scene(layout);
        window.setScene(scene);
        window.showAndWait();

        return ynAnswer;
    }

    public String desplayTextMessgae(String title, String message){
        Stage window = new  Stage();
        window.initModality(Modality.APPLICATION_MODAL);
        window.setTitle(title);
        window.setMinWidth(250);
        Label label1 = new Label();
        label1.setText(message);

        //form
        TextField nameInput = new TextField();
        Button loadBbutton = new Button("Upload");
        loadBbutton.setOnAction(e -> {
            textAnswer = nameInput.getText();
            window.close();
        });


        //Layout
        VBox layout = new VBox(10);
        layout.setPadding(new Insets(20, 20, 20, 20));
        layout.getChildren().addAll(nameInput, loadBbutton);

        //Set scene and show in window.
        Scene scene = new Scene(layout, 300, 100);
        window.setScene(scene);
        window.show();

        return textAnswer;
    }

}
James_D

GUI 프로그래밍에서 루프 기반 접근 방식을 고려하기 전에 항상 이벤트 기반 접근 방식을 고려하십시오. while 루프는 단순히 반복적으로 컨트롤을 만들고, 그 중 하나 (버튼)에 리스너를 등록하고, 컨트롤을 새 창에 배치하고, 창을 표시합니다. 루프는 다음 반복으로 진행하기 전에 버튼이 눌릴 때까지 기다리지 않습니다. 그래서 당신은 많은 창으로 끝납니다 ...

유효한 파일이 입력 될 때까지 스테이지가 표시 될 때 코드를 차단하려고합니다. Stage는 showAndWait창을 표시 한 다음 창이 닫힐 때까지 실행을 차단 하는 메서드를 정의합니다 . (이것은 본질적으로 FX 응용 프로그램 스레드에서 호출해야하는 유일한 차단 방법입니다. 코드 실행이 차단되는 동안 UI가 응답 성을 유지하도록하는 마법이 있습니다.) 따라서 한 가지 방법은 showAndWait루프에서 호출 하는 것입니다. 창이 닫힐 때까지 다음 반복으로 진행되는 루프 :

while(!inputFile.exists()) {
    window = new Stage();
    window.initModality(Modality.APPLICATION_MODAL);
    window.setTitle("File was not found.");
    window.setMinWidth(250);
    window.setMaxHeight(100);

    //form
    TextField fileInput = new TextField();
    Button inputButton = new Button("Upload File");
    inputButton.setOnAction(e -> {
        inputFile = new File(fileInput.getText());
        window.close();
    });


    //Layout
    VBox layout = new VBox(10);
    layout.setPadding(new Insets(20, 20, 20, 20));
    layout.getChildren().addAll(fileInput, inputButton);

    //Set scene and show in window.
    Scene scene = new Scene(layout, 300, 100);
    window.setScene(scene);
    window.showAndWait();

}

파일이 존재하는 경우에만 창을 닫아서 좀 더 멋지게 만들 수 있습니다.

inputButton.setOnAction(e -> {
    inputFile = new File(fileInput.getText());
    if (inputFile.exists()) {
        window.close();
    }
});

파일이 존재하지 않는 한 버튼을 비활성화하여 더 멋지게 만들 수 있습니다.

TextField fileInput = new TextField();
Button inputButton = new Button("Upload File");
inputButton.setDisable(true);
fileInput.textProperty().addListener((obs, oldText, newText) -> 
    inputButton.setDisable( ! new File(newText).exists() ) );
inputButton.setOnAction(e -> {
    inputFile = new File(fileInput.getText());
    window.close();
});

또는 바인딩 사용 :

TextField fileInput = new TextField();
Button inputButton = new Button("Upload File");
inputButton.disableProperty().bind(Bindings.createBooleanBinding(
    () -> ! new File(fileInput.getText()).exists(), 
    fileInput.textProperty()));
inputButton.setOnAction(e -> {
    inputFile = new File(fileInput.getText());
    window.close();
});

마지막으로, 파일이 유효하지 않은 경우 확인 버튼을 비활성화하면 창을 꾸미지 않게 할 수 있습니다 (최소화, 최대화 또는 결정적으로 닫기 버튼 없음). 그러면 유효한 파일을 입력하지 않으면 창을 닫을 수 없으며 루프를 완전히 제거 할 수 있습니다. 유효한 파일을 찾을 수없는 경우 사용자가 짜증을 낼 수 있습니다 (이스케이프 경로가 없음).

if (! inputFile.exists()) {
    window = new Stage();
    window.initModality(Modality.APPLICATION_MODAL);
    window.initStyle(StageStyle.UNDECORATED);
    window.setTitle("File was not found.");
    window.setMinWidth(250);
    window.setMaxHeight(100);

    //form
    TextField fileInput = new TextField();
    Button inputButton = new Button("Upload File");
    inputButton.disableProperty().bind(Bindings.createBooleanBinding(
        () -> ! new File(fileInput.getText()).exists(), 
        fileInput.textProperty()));
    inputButton.setOnAction(e -> {
        inputFile = new File(fileInput.getText());
        window.close();
    });


    //Layout
    VBox layout = new VBox(10);
    layout.setPadding(new Insets(20, 20, 20, 20));
    layout.getChildren().addAll(fileInput, inputButton);

    //Set scene and show in window.
    Scene scene = new Scene(layout, 300, 100);
    window.setScene(scene);
    window.showAndWait();
}

마지막으로 사용자가 파일을 선택할 수 있도록하려면 FileChooser( tutorial )을 사용할 수 있습니다 .

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

while 루프에서 멈춤

분류에서Dev

Java JToggleButton이 While 루프에서 멈춤

분류에서Dev

Java JToggleButton이 While 루프에서 멈춤

분류에서Dev

분기 후 while 루프에서 멈춤

분류에서Dev

sh 스크립트가 while 루프의 읽기 명령에서 멈춤

분류에서Dev

while 루프로 멈춤

분류에서Dev

카운트가있는 for 및 while 루프의 C ++ 센티넬. 무한 루프에서 멈춤

분류에서Dev

자바 : while 루프가 프로그램을 멈춤

분류에서Dev

while 루프 중에 양식이 멈춤

분류에서Dev

루프가 무한 루프에 멈춤

분류에서Dev

WSL2에서 While 루프로 멈춤

분류에서Dev

mouseover 이미지가 루프에 멈춤

분류에서Dev

첫 페이지에 루프가 멈춤

분류에서Dev

PHP가 루프 운동에 멈춤

분류에서Dev

while 루프를 끊으려고 할 때 무한 루프에서 멈춤

분류에서Dev

Grunt가 uglify에서 멈춤

분류에서Dev

Ubuntu가 로그인 루프에서 멈춤

분류에서Dev

응용 파서가 무한 루프에 멈춤

분류에서Dev

루프가 세 번째 인덱스에서 멈춤

분류에서Dev

iMacros가 무작위로 루프에서 멈춤

분류에서Dev

Ubuntu 18.04.2 (LTS)가 로그인 루프에서 멈춤

분류에서Dev

Worklight Direct Update가 다운로드 루프에서 멈춤

분류에서Dev

LyncClient가 로그인 루프에서 멈춤

분류에서Dev

PHP 헤더 (위치 :)가 리디렉션 루프에서 멈춤

분류에서Dev

코드의 임의 지점에서 루프가 멈춤

분류에서Dev

SQL Server : @@ fetch_status를 사용하여 WHILE 루프에 멈춤

분류에서Dev

Do-While 문이 무한 루프에 멈춤

분류에서Dev

연결된 목록의 무한 Do-while 루프에서 멈춤

분류에서Dev

Redstone Mapper가 펍에 멈춤