2017-07-14 235 views
0

还有就是我的主类:更改标签文本的JavaFX FXML

public class Main extends Application { 
private static Stage primaryStage; 
public static BorderPane mainLayout; 

@Override 
public void start(Stage primaryStage) { 
    this.setPrimaryStage(primaryStage); 
    primaryStage.setTitle("Project"); 

    try { 
     mainLayout = 
     FXMLLoader.load(Main.class.getResource("/main/view/MainPage.fxml")); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     Scene scene = new Scene(mainLayout); 
     primaryStage.setScene(scene); 
     primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() { 

      @Override 
      public void handle(WindowEvent event) { 
       System.exit(0); 
      } 
     }); 
     primaryStage.show(); 
    } 

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

    public static Stage getPrimaryStage() { 
     return primaryStage; 
    } 

    public void setPrimaryStage(Stage primaryStage) { 
     Main.primaryStage = primaryStage; 
    } 
} 

我窗口的这个FXML:

<?xml version="1.0" encoding="UTF-8"?> 

<?import javafx.geometry.Insets?> 
<?import javafx.scene.control.Label?> 
<?import javafx.scene.layout.BorderPane?> 
<?import javafx.scene.layout.VBox?> 
<?import javafx.scene.text.Font?> 

<BorderPane prefHeight="410.0" prefWidth="512.0" 
xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" 
fx:controller="main.controller.MainController"> 
<center> 
    <VBox alignment="CENTER" prefHeight="200.0" prefWidth="100.0" 
    spacing="20.0" BorderPane.alignment="CENTER"> 
    <children> 
     <Label fx:id="aaa" prefHeight="72.0" prefWidth="336.0" 
text="Project" textAlignment="CENTER"> 
      <font> 
       <Font name="Century Gothic" size="25.0" /> 
      </font> 
     </Label> 
    </children> 
    <padding> 
     <Insets bottom="30.0" /> 
    </padding> 
    </VBox> 
</center> 
</BorderPane> 

这是控制器的这种FXML:

public class MainController { 
@FXML 
private static Label aaa; 

@FXML 
public static void initialize(){ 
    aaa.setText("AHOJ"); 

    } 
} 

我想从另一个类调用方法initialize()10次,如下所示:

public class MyClass { 
public static void main(String[] args) { 
    for (int i = 0; i < 10; i++) { 
     MainController.initialize(); 
    } 
} 
} 

但存在NullPointerException。有人能帮我吗?

+0

你有NPE,因为你的静态字段不被初始化。循环的最终目标是什么? –

+0

这是例子。我的目标是通过从另一个班级调用方法来更新标签文本,但只是一次,但我不知道如何。 –

+0

其他课程是什么?这是一个FX应用程序,通过main()方法运行,并在单独的线程中运行。你打算从哪个班改变一个标签? –

回答

1

只是删除静态的字段和方法,然后通过运行应用程序的main()主类:

public class MainController { 
    @FXML 
    private Label aaa; 

    @FXML 
    public void initialize(){ 
     aaa.setText("AHOJ"); 
    } 
} 
+0

我知道它有效,但我想从另一个类调用方法initialize()。或者我想找到任何其他方式,如何更多地更新我的标签文本从另一个类。例如,每次都有其他的单词。 –

+0

不可能从Main和MyClass运行main()并在彼此之间进行交互。您可以仅从FX应用程序更改标签,作为对用户操作或后台作业的反应。比方说,用户做了一些事情,结果标签发生了变化。 –

+0

您的控制器应该用于更新或“控制”它们所代表的FXML上的项目。如果你想从其他地方调用更新,你可以看看如何做到这一点的链接。在控制器上创建一个方法... https://stackoverflow.com/questions/33237356/access-controller-in-another-controller-class –