Исключение в конструкторе приложений при создании конструктора - PullRequest
0 голосов
/ 29 апреля 2018

Когда я запускаю приведенный ниже код, он работает

import javafx.application.Application;
public class Client {
public static void main(String[] args){
    Test t2 = new Test();
    Application.launch(t2.getClass(),args);
    }
}

, где тестовый класс

package com.temp.com.serverclient;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class Test extends Application {
@Override
public void start(Stage primaryStage) {
    primaryStage.setTitle("No Main");
    StackPane root = new StackPane();
    root.getChildren().add(new Label("It worked!"));
    primaryStage.setScene(new Scene(root, 300, 120));
    primaryStage.show();
    }
}

Но если я пытаюсь добавить конструктор, он получает исключение в конструкторе приложения, ошибка. Код

package com.temp.com.serverclient;

import javafx.application.Application;

public class Client {
public static void main(String[] args){

    Test t1 = new Test("Pass this String to Constructor");
    Application.launch(t1.getClass(),args);
    }
}

Тестовый класс

package com.temp.com.serverclient;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class Test extends Application {
String str;
public Test(String str) {
    this.str = str;
}
@Override
public void start(Stage primaryStage) {
    primaryStage.setTitle("No Main");
    StackPane root = new StackPane();
    root.getChildren().add(new Label("It worked!"));
    primaryStage.setScene(new Scene(root, 300, 120));
    primaryStage.show();
    }
 }

Как я могу решить проблему? Мне нужно передать строку для сбора информации из предыдущего класса.

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018

Application.launch всегда использует конструктор public без параметров для создания экземпляра класса приложения для запуска. (Это не дает никаких преимуществ для создания экземпляра в основном методе BTW. Просто передайте класс без создания экземпляра, т.е. Application.launch(Test.class, args);.)

Фактически вы можете только передать параметры String в новый экземпляр класса вашего приложения без использования static членов, и это делается с помощью параметра args Application.launch:

public class Client {
    public static void main(String[] args) {
        Application.launch(Test.class, "Pass this String to Constructor");
    }
}
public class Test extends Application {

    String str;

    @Override
    public init() {
        this.str = getParameters().getRaw().get(0);
    }

    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("No Main");
        StackPane root = new StackPane();
        root.getChildren().add(new Label("It worked!"));
        primaryStage.setScene(new Scene(root, 300, 120));
        primaryStage.show();
    }
}

Обратите внимание, что доступ к свойству parameters также возможен для метода start.


В JavaFX 9 появилась новая возможность: использовать Platform.startup, но вам нужно самостоятельно обрабатывать жизненный цикл класса приложения:

Application app = new Test("Pass this String to Constructor");
app.init();
Platform.startup(() -> {
    Stage stage = new Stage();
    try {
        app.start(stage);
    } catch (Exception ex) {
        throw new IllegalStateException(ex);
    }
});

Это неправильно вызывает метод Application.stop. Также параметры не назначены.

0 голосов
/ 29 апреля 2018

AFAIK, Application.launch создает новый экземпляр Test. Следовательно, вам нужен другой способ получить значение для экземпляра, e. г. используя статический метод получения в вашем классе Client, который вызывается из Test

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