JavaFX的。从start方法的helper方法更改实例变量

时间:2018-03-29 20:44:58

标签: java javafx

大家好!

这是我的代码:

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

public class QuestionClass extends Application {
    String labelText;

    public static void main(String[] args) {
        QuestionClass questionClass = new QuestionClass();
        questionClass.setLabelText(); 
        launch(args);
    }

    public void start(Stage primaryStage) {
        Label label = new Label();

        // why string value wasn't assigned to string labelText in setLabelText()?
        System.out.println("labelText in start(): " + labelText); // OUTPUT: null

        label.setText(labelText);

        HBox pane = new HBox(label);

        Scene scene = new Scene(pane, 100, 100);

        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public void setLabelText() {
        labelText = "The Text";
        System.out.println("labelText in setLabelText(): " + labelText); // OUTPUT: The Text
    }

}

我遇到String labelText的问题,这是一个实例变量。我希望当我创建类QuestionClass的实例然后在其上调用方法setLabelText()时,变量labelText将更改为值“文本”。这是真的。

但之后我通过调用方法launch(args)来初始化构建我的JavaFX GUI,并且我希望我的labelText变量已经设置为“文本”值,这可能不会发生,值和值labelText的结果为空。

问题是“为什么?”。我的推理在哪里有缺陷?

1 个答案:

答案 0 :(得分:1)

这里的问题是你在QuestionClass的另一个实例中设置标签的值,然后是向用户显示的那个。解决方案是在当前QuestionClass实例的start方法中调用setLabelText()方法,以便它将引用Question类的当前实例。

从而改变了这部分代码:

    public static void main(String[] args) {
    QuestionClass questionClass = new QuestionClass();
    questionClass.setLabelText(); 
    launch(args);
}

public void start(Stage primaryStage) {
    Label label = new Label();

    // why string value wasn't assigned to string labelText in setLabelText()?
    System.out.println("labelText in start(): " + labelText); // OUTPUT: null

    label.setText(labelText);

    HBox pane = new HBox(label);

    Scene scene = new Scene(pane, 100, 100);

    primaryStage.setScene(scene);
    primaryStage.show();
}

对此:

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

public void start(Stage primaryStage) {
    Label label = new Label();
    //this will call the method on the current instance of your Question class so it will work
    setLabelText();
    // why string value wasn't assigned to string labelText in setLabelText()?
    System.out.println("labelText in start(): " + labelText); // OUTPUT: null

    label.setText(labelText);

    HBox pane = new HBox(label);

    Scene scene = new Scene(pane, 100, 100);

    primaryStage.setScene(scene);
    primaryStage.show();
}

现在应该可以正常工作,因为它是在当前实例上调用的。