2016-12-04 14 views
0

MainControllerクラスがfxmlで指定されているアプリケーションを起動するMainクラスがあります。 Connectボタンをクリックすると、シーンとコントローラーの異なる別のウィンドウが開きます。私がMainControllerを通してテキスト値をLabelに変更したいというアクションに基づいていますが、期待どおりに動作しません。以下の詳細を参照してください。Java FXの変更前のステージのシーンのラベルテキスト

connectedLabelMainControllerクラスのテキストを基本的にConnectControllerクラスから更新したいと思います。動作しません。

Main.java

public class Main extends Application { 

    private static final Logger logger = Logger.getLogger(Main.class.getName()); 

    @Override 
    public void start(Stage primaryStage) { 
     try { 
      logger.info("Application is starting"); 
      AnchorPane page = FXMLLoader.load(getClass().getResource("Main.fxml")); 

      //BorderPane root = new BorderPane(); 
      //Scene scene = new Scene(root,400,400); 

      Scene scene = new Scene(page); 
      scene.getStylesheets().add(getClass().getResource("Main.css").toExternalForm()); 
      primaryStage.setScene(scene); 

      primaryStage.setResizable(false); 

      primaryStage.show(); 

     } catch(Exception e) { 
      logger.warning(e.getMessage()); 
     } 
    } 

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

} 

MainController.java

public class MainController implements Initializable { 

    private Context context = null; 

    @FXML 
    Label connectedLabel; 
    @FXML 
    Button connectButton; 

    @Override 
    public void initialize(URL location, ResourceBundle resources) { 
     context = Context.getInstance(); 
    } 

    public void setConnectedLabel(String name) { 
     connectedLabel.setText(name); 
     connectButton.setText("Disconnect"); 
    } 

    @FXML 
    public void connectTokenButton_onMouseClicked() { 
     try { 
      if (connectTokenButton.getText().equals("Disconnect")) { 
       boolean disconnected = context.getToken().disconnectToken(); 
       if (disconnected) { 
        Alert alert = new Alert(AlertType.INFORMATION); 
        alert.setTitle("Disconnected"); 
        alert.setHeaderText(null); 
        alert.setContentText("Succcessfully disconnected!"); 

        alert.showAndWait(); 

        connectedTokenLabel.setText("N/A"); 
        connectTokenButton.setText("Connect"); 
       } 
      } else { 
       AnchorPane page = FXMLLoader.load(getClass().getResource("ConnectView.fxml")); 

       Stage stage = new Stage(); 

       Scene scene = new Scene(page); 
       scene.getStylesheets().add(getClass().getResource("ConnectView.css").toExternalForm()); 
       stage.setScene(scene); 

       stage.setResizable(false); 
       stage.initModality(Modality.APPLICATION_MODAL); 
       stage.initOwner(connectedLabel.getScene().getWindow()); 
       stage.show(); 

       //Stage thisStage = (Stage) connectedTokenLabel.getScene().getWindow(); 
       //thisStage.close(); 
      } 
     } catch (Exception e) { 
      System.out.println(e); 
     } 
    } 
} 

ConnectController.java:別のコントローラからsetConnectedLabelメソッドを呼び出すときに私が間違っているのは何

public class ConnectController implements Initializable { 

    private Context context = null; 

    @FXML 
    ComboBox<String> selectComboBox; 
    @FXML 
    PasswordField userPinPasswordField; 
    @FXML 
    Button cancelButton; 

    @Override 
    public void initialize(URL location, ResourceBundle resources) { 
     context = Context.getInstance(); 
    } 

    public void setMainC(Stage stage) { 
     mainStage = stage; 
    } 

    @FXML 
    private void connectToken_onMouseClicked() { 
     String pin = userPinPasswordField.getText(); 
     boolean connected = context.connect(selectComboBox.getValue(), pin);   
     if (connected) { 

      Alert alert = new Alert(AlertType.INFORMATION); 
      alert.setTitle("Connected"); 
      alert.setHeaderText(null); 
      alert.setContentText("Succcessfully connected!"); 

      alert.showAndWait(); 

      FXMLLoader myLoader = new FXMLLoader(getClass().getResource("Main.fxml")); 
      MainController mainController = myLoader.getController(); 
      mainController.setConnectedTokenLabel(context.getConnectedName()); 

      Stage thisStage = (Stage) selectComboBox.getScene().getWindow(); 
      thisStage.close(); 
     } 
    } 
} 

答えて

0
FXMLLoader myLoader = new FXMLLoader(getClass().getResource("Main.fxml")); 
MainController mainController = myLoader.getController(); 
mainController.setConnectedTokenLabel(context.getConnectedName()); 

FXMLLoaderloadメソッドを呼び出すことなく、何のコントローラインスタンスはfx:controller属性はFXMLファイルで指定されている場合でも、作成されません。

loadgetControllerの前に呼び出すと、fxmlが別のコントローラインスタンスで再度読み込まれるだけなので、助けになりません。

ConnectControllerは、それが作成されたMainControllerについて「知らせる」必要があります。

一つの方法は、ConnectControllerクラス

private MainController mainController; 

public void setMainController(MainController mainController) { 
    this.mainController = mainController; 
} 

にこのコードを追加してconnectToken_onMouseClicked()方法でローカル変数の代わりに、このフィールドを使用することであろう(Passing Parameters JavaFX FXMLを参照)。

connectTokenButton_onMouseClicked()ビューをロードした後、コントローラにアクセスし、セッターを呼び出すために:

FXMLLoader loader = new FXMLLoader(getClass().getResource("ConnectView.fxml")); 
AnchorPane page = loader.load(); 
loader.<ConnectController>getController().setMainController(this); 
関連する問題