2016-12-04 4 views
0

MainController 클래스가 fxml에 지정된 내 응용 프로그램을 시작하는 Main 클래스가 있습니다. Connect 버튼을 클릭하면 다른 장면과 컨트롤러가있는 다른 창이 열립니다. 작업에 따라 LabelMainController 통해 텍스트 값을 변경하고 있지만 예상대로 작동하지 않습니다. 아래 세부 정보를 참조하십시오.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);