2016-07-02 10 views
0

私の問題は:.fxmlから何かを変更したいですが、私が何をしても変更はありません。これは単なる例に過ぎません。別のクラスのFXMLコンポーネントを変更/更新します

私は全体のインターネットに行きましたが、解決策のどれも私のために働いていませんでした。 ここでは、メインクラスから対応するメソッドを呼び出すことによって、ラベルのテキストを変更したいと考えています。

ボタンをクリックしたときに同じメソッド(ここではsetLabel())を呼び出すと、コントローラクラス内のイベントハンドラで、すべて正常に動作しますが、まもなく別のクラスから何かを修正しようとすると何も動作しません。

メインクラス:

package sample; 
import javafx.application.Application; 
import javafx.application.Platform; 
import javafx.fxml.FXMLLoader; 
import javafx.scene.Parent; 
import javafx.scene.Scene; 
import javafx.stage.Stage; 

public class Main extends Application { 

@Override 
public void start(Stage primaryStage) throws Exception{ 

Parent root = FXMLLoader.load(getClass().getResource("sample.fxml")); 
primaryStage.setTitle("Hello World"); 
primaryStage.setScene(new Scene(root, 300, 275)); 
primaryStage.show(); 
Controller controller = new Controller(); 
Platform.runLater(()->controller.setLabel()); 

} 

FXMLコード:

<BorderPane xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Controller"> 
    <center> 
     <Label fx:id="label" text="This" BorderPane.alignment="CENTER" /> 
    </center> 
</BorderPane> 

コントローラクラス: パッケージサンプル。

import javafx.fxml.FXML; 
import javafx.scene.control.Label; 

public class Controller { 
@FXML 
private Label label=new Label(); 

public void setLabel(){ 
    label.setText("Test"); 
} 
} 

答えて

0

に置き換える必要があります...あなたはどちらかあなたのコントローラでgetterメソッドを追加することによって、自分のメインクラスからラベルテキストを変更することができますクラスを作成し、コントローラオブジェクト(loader.getController())を使用してMainクラスで取得し、そのテキストを更新します。または、Mainのコントローラーオブジェクトを使用して、Controllerクラス内のsetterメソッドを呼び出します。 DVagraによれば、loader.getController()を使用してコントローラオブジェクトを取得します。 (ローダーはFXMLoaderのオブジェクトです)。

さらに、Guiコントロールを更新するためにPlatform.runLater()は必要ありません。すでにFXスレッドで実行しているので。

とにかく、ここに必要なものがあります。

メインクラス

package sample; 
import javafx.application.Application; 
import javafx.fxml.FXMLLoader; 
import javafx.scene.Parent; 
import javafx.scene.Scene; 
import javafx.stage.Stage; 

public class Main extends Application { 
@Override 
public void start(Stage primaryStage) throws Exception{ 
    FXMLLoader loader = new FXMLLoader(); 
    loader.setLocation(Main.class.getResource("sample.fxml")); 
    Parent root = loader.load(); 
    primaryStage.setTitle("Hello World"); 
    primaryStage.setScene(new Scene(root, 300, 275)); 
    primaryStage.show(); 

    Controller controller = loader.getController(); 

    controller.setLabel("Test"); 
// Or 
// controller.getLabel().setText("Test"); 
} 
public static void main(String[] args) { 
    launch(args); 
} 
} 

コントローラクラス

package sample; 
import javafx.fxml.FXML; 
import javafx.fxml.Initializable; 
import javafx.scene.control.Label; 
import java.net.URL; 
import java.util.ResourceBundle; 

public class Controller implements Initializable{ 
@FXML 
Label label; 

//setter 
public void setLabel(String labelText){ 
    label.setText(labelText); 
} 

//getter for label 
public Label getLabel() { 
    return label; 
} 

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

Sample.fxml

<?xml version="1.0" encoding="UTF-8"?> 
<?import javafx.scene.control.Label?> 
<?import javafx.scene.layout.BorderPane?> 

<BorderPane xmlns="http://javafx.com/javafx/8.0.60" 
xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Controller"> 
<center> 
    <Label fx:id="label" text="This" BorderPane.alignment="CENTER" /> 
</center> 
</BorderPane> 
+0

私の "本当の"プロジェクトでは、私はsetterメソッドを呼び出すことができません。私はいつも私にヌルポインタの実行を与えます。私はコントローラが初期化されていないようだ... = loader.getController(); –

+0

どのようにローダオブジェクトを取得していますか?親切にコードスニペットを投稿してください。 –

+0

私はもう一度あなたに感謝し、私は数日間、この問題で立ち往生して、今ではすべてが動作しますが、少し早すぎるメソッドを呼び出し –

1

コードには実際に2つの問題があります。正しいFXMLLoaderを使用してApplicationは、ロードsample.fxmlstart方法では、

1)Controller controller = new Controller();のような新しいコントローラーを作成すると、getControllerメソッドを使用してFXMLLoader自体からコントローラーを取得する必要があります。また、loadという静的関数を使用しないでください。ただし、そのインスタンスを作成する必要があります。

FXMLLoader loader = new FXMLLoader(); 
Parent root = loader.load(getClass().getResource("sample.fxml")); 
Controller controller = loader.getController(); 

あなたはそれがFXMLファイルからオブジェクト階層をロードすると、それはまた、(FXMLファイル内で参照)コントローラを作成しますFXMLLoaderloadを呼び出します。

2)Controllerでは、FXMLファイルからLabelを挿入しますが、再作成します。 FXMLLoaderfx:idに基づいてコントローラにコントローラを注入すると、初期化も保証されます。新しいLabelを作成した場合は、ローダーによって作成されたLabelインスタンスを指しません。

この

@FXML private Label label= new Label(); 

は非常に単純です

@FXML private Label label; 
+0

ありがとう、これははるかに有用トンでした私が見つけた他のすべてのもの。 :) –

関連する問題