Как открыть всплывающее окно из другого класса без нажатия кнопки в javaFX? - PullRequest
0 голосов
/ 03 мая 2020

Итак, у меня есть метод popup в классе контроллера javaFX, который открывает небольшое всплывающее окно поверх реального окна приложения. Этот метод работает без проблем, если он назначен кнопке в f xml и кнопка нажата, но я не хочу ее использовать.

У меня есть другой класс под названием «Таймер» с новым заданием (новый поток), который ведет обратный отсчет с определенного числа, и в какой-то момент он откроет всплывающее окно с сообщением. Моя цель - вызвать и запустить метод popup из этого класса Timer. Когда я вызываю метод 'popup' отсюда, он начинает выполняться, но всплывающее окно вообще не появляется. (Вызов метода происходит, когда я получаю сообщение «in popup» на консоли из метода «popup».)

Так почему же это работает, когда нажатие кнопки вызывает метод «popup» из файла f xml и почему нет, когда я звоню из другого класса? Спасибо.

Пожалуйста, посмотрите класс контроллера с методом popup и класс Timer ниже (используя Gradle в проекте):

Класс контроллера "SceneController":

package GradleFX;

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.PasswordField;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.text.Text;
import javafx.stage.Modality;
import javafx.stage.Stage;


import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;

//import java.awt.event.ActionEvent;

public class SceneController implements Initializable {

    public static String password = "";
    protected static int timercount = 20;


    @FXML
    private Label PWLabel;

    @FXML
    private Label bottomLabel;

    @FXML
    private PasswordField PWField;
    @FXML
    private Label showPWLabel;

    protected static Label myBottomLabel;
    private static PasswordField myPWField;
    private static Label myShowPWLabel;

    private static int tries;

    @Override
    public void initialize(URL location, ResourceBundle resources) {

        Timer timerTask = new Timer();

        myBottomLabel = bottomLabel;
        myPWField = PWField;
        myShowPWLabel = showPWLabel;

        new Thread(timerTask).start();
    }

    **/***********************************************************************
     /*This method runs if button is pressed in main application,
     but can't make it work by calling it from Timer Class */

    public void popup() {
        System.out.println("in popup");
        Stage dialogStage = new Stage();
        dialogStage.initModality(Modality.WINDOW_MODAL);

        VBox vbox = new VBox(new Text("Hi"), new Button("Ok."));
        vbox.setAlignment(Pos.CENTER);
        vbox.setPadding(new Insets(15));

        dialogStage.setScene(new Scene(vbox));
        dialogStage.show();
    }

    //****************************************************************************
    public void showPW() {
        myShowPWLabel.setText(myPWField.getText());
    }

    public void hidePW() {
        myShowPWLabel.setText("");
    }

    public void exit() {
        System.exit(0);
    }

    public void write() {
        PWLabel.setText("Mukodik");

    }

    public void writeInput(String in) {

        password = in;
        System.out.println("final password text text: " + password);
        writeFinally();

    }

    public void writeFinally() {

        System.out.println("This is 'password' : " + password);
        //bottomLabel.setText(password);
    }

    public void bottomLabelWrite() {
        bottomLabel.setText(myPWField.getText());
    }

    public static void setLabel() throws InterruptedException {
        myBottomLabel.setText("");
        myBottomLabel.setText("Database has been permanently erased.");
        //Thread.sleep(3000);
        //System.exit(0);
    }

    public static void noKeyEnteredNote() {
        myBottomLabel.setTextFill(Color.BLACK);
        myBottomLabel.setText("No key entered. Type Main Key.");
    }

    public static void rightKey() {
        myBottomLabel.setText("Yes, this is the right key.");
    }

    public static void wrongKey() throws InterruptedException {
        tries = MasterKey.numOfTryLeft;
        if (tries > 0) {
            myBottomLabel.setTextFill(Color.RED);
            myBottomLabel.setText("!!!Wrong key!!! You've got " + tries + " tries left!");

        }
    }

    public void simpleTest(String in) {
        System.out.println("in simpleTest and in is: " + in);
    }


    public void getMainKey() throws IOException, InterruptedException {
        MasterKey masterKey = new MasterKey();
        System.out.println("Inside SceneController");

        masterKey.requestKey(myPWField.getText());


    }

    public void changeScreen(ActionEvent event) throws IOException, InterruptedException {

        getMainKey();
        if (MasterKey.isRightKey) {
            Parent tableViewParent = FXMLLoader.load(getClass().getResource("Menu.fxml"));
            Scene tableViewScene = new Scene(tableViewParent);

            Stage window = (Stage) ((Node) event.getSource()).getScene().getWindow();
            window.setScene(tableViewScene);
            window.show();
        }
    }


}

Это класс таймера:

    package GradleFX;


import javafx.concurrent.Task;
import javafx.event.ActionEvent;


public class Timer extends Task {

    private ActionEvent actionEvent;

    @Override
    protected Integer call() throws Exception {
        boolean notCalled = true;

        while (SceneController.timercount > 0) {
            SceneController sceneController = new SceneController();


            System.out.println(SceneController.timercount);
            Thread.sleep(1000);
            SceneController.timercount--;
            if (SceneController.timercount < 19) {

                System.out.println("Less than 5");

                if(notCalled) {
                    sceneController.popup();
                    notCalled = false;
                }



            }


        }
        System.exit(0);

        return null;
    }


}

1 Ответ

0 голосов
/ 03 мая 2020

Добавьте это к своему коду:

@Override
public void initialize(URL location, ResourceBundle resources) {

    Timer timerTask = new Timer();

    myBottomLabel = bottomLabel;
    myPWField = PWField;
    myShowPWLabel = showPWLabel;

    new Thread(timerTask).start();
    timerTask.setOnFinished(e->{
        popup();
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...