Ярлык Javafx не отображается в окне - PullRequest
0 голосов
/ 13 марта 2019

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

Метка myResponse не отображает текст в окне, и я понятия не имею, почему. Я искал во многих программах, и моя не использует этот ярлык по-другому.

Кроме того, если я введу число в текстовое поле и нажму клавишу ввода, я не смогу закрыть программу, используя «x» в правом верхнем углу.

Буду благодарен за помощь в решении этих проблем. Заранее спасибо.

Вот код:

import javafx.application.*;
import javafx.stage.*;
import javafx.scene.*;
import javafx.scene.layout.*;
import javafx.scene.control.*;
import javafx.event.*;
import javafx.geometry.*;
import java.io.IOException;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;

public class CompSwitchOff extends Application  {

Label myText;
Label myResponse;
Button btn= new Button ("press enter.");
TextField tf;
String s= "";
int i;

public static void main (String [] args){
    launch (args);
}

public void start (Stage myStage){

    myStage.setTitle("TIMER");
    FlowPane rootNode= new FlowPane(20,20);
    rootNode.setAlignment(Pos.CENTER);
    Scene myScene= new Scene (rootNode,230, 200);
    myStage.setScene(myScene);
    myText= new Label ("how many minutes to shut down the computer?: ");
    myResponse= new Label(); 
    tf= new TextField ();
    tf.setPrefColumnCount(10);
    tf.setPromptText("Enter time to count.");



    tf.setOnAction( (ae)-> {

        s= tf.getText();
        myResponse.setText("computer will switch off in "+ s+ " minuts.");
        i= Integer.parseInt(s)*60000;

        try{ Thread.sleep(i);}
        catch (InterruptedException ie){}

        Process process;
        try{
            process=Runtime.getRuntime().exec("shutdown -s -t 0");
        }
        catch (IOException ie){

        }  
    }
    );
    btn.setOnAction((ae)->{
        s= tf.getText();
        myResponse.setText("computer will switch off in "+ s+ " minuts.");
        i= Integer.parseInt(s)*60000;

        try{ Thread.sleep(i);}
        catch (InterruptedException ie){}

        Process process;
        try{
            process=Runtime.getRuntime().exec("shutdown -s -t 0");
        }
        catch (IOException ie){

        }  

    }
    );

    rootNode.getChildren().addAll(myText, tf, btn, myResponse);
    myStage.show();
    myStage.setOnHidden((eh)->{});              
}
}

1 Ответ

1 голос
/ 14 марта 2019

Как уже отмечал Зефир, метод Thread.sleep() блокирует весь ваш метод от дальнейшего выполнения.Если вы добавите несколько операторов журнала, вы увидите, что программа останавливается после Thread.sleep(i).Хотя текст вашей метки установлен до Thread.sleep(i), перерисовка графического интерфейса, вероятно, происходит после этого.

Поэтому, чтобы запустить его, вы должны добавить свой Thread.sleep(i) в новый поток и там, где он не может заблокировать ваш основной(GUI) поток.

Например:

new Thread(() -> {
    try {
        Thread.sleep(i);
    } catch (InterruptedException e) {
        System.out.println(e.getMessage());
    }
    Process process;
    try {
        process = Runtime.getRuntime().exec("shutdown -s -t 0");
    } catch (IOException e) {
        System.out.println(e.getMessage());
    }
}).start();
...