2017-07-14 5 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()を呼び出す:

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

しかし、NullPointerExceptionがあります。誰か助けてくれますか?

+0

を静的フィールドが初期化されていないので、あなたがNPEを得ました。 forループの最終目標は何ですか? –

+0

これは例です。私の目標は、別のクラスのメソッドを呼び出すことで、ラベルのテキストを一回だけ更新することですが、その方法はわかりません。 –

+0

他のクラスとは何ですか?これはFXアプリケーションで、main()メソッドを介して実行され、別のスレッドで実行されます。どのクラスからラベルを変更する予定ですか? –

答えて

1

ただ、メインクラスに)(メインでアプリケーションを実行し、フィールドやメソッドの静を削除します。

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 –

関連する問題