2017-11-28 4 views
2

JavaFX에서 장면 사이에 문자열을 전달하려고하는데 이미 some answers을 따라 갔지만 문자열이 새 장면에서 null이기 때문에 작동하지 않는 것으로 보입니다.속성 사이에 속성을 전달할 수 없습니다. JAvaFX

public class FXMLDocumentController implements Initializable { 


    @FXML 
    private Button btn_signup; 
    @FXML 
    private TextField et_username; 
    @FXML 
    private PasswordField et_password; 
    @FXML 
    private Hyperlink link_login; 

    Stage prevStage; 

    public void setPrevStage(Stage stage){ 
     this.prevStage = stage; 
    } 

    @FXML 
    private void handleButtonAction(ActionEvent event) throws IOException { 

     if(btn_signup == event.getSource()){ 
      Conector conn = new Conector(); 

     if (conn.checkUser(et_username.getText(), et_password.getText())) { 
        FXMLLoader myLoader = new FXMLLoader(getClass().getResource("FXMLTasker.fxml")); 
         Pane myPane = (Pane)myLoader.load(); 



        Scene scene = new Scene(myPane); 

        Stage stage = new Stage(); 

        stage.setResizable(false); 
        stage.setScene(scene); 

        FXMLTaskerController controler = new FXMLTaskerController(); 
        controler.setUser(et_username.getText()); 
        myLoader.setController(controler); 
        prevStage.close(); 
        stage.show(); 
     }else { 
      JOptionPane.showMessageDialog(null, "Usuario o Contraseña incorrecta"); 
     } 

     }else if (link_login == event.getSource()){ 
      System.out.println("Registrate!"); 
     } 


    } 

    @Override 
    public void initialize(URL url, ResourceBundle rb) { 
     // TODO 
    }  

} 

여기 다른 클래스 controler를이야, 난 내 문자열을 원하는 하나를

여기 내 MainControler입니다. 세트를 사용하여

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

<?import javafx.scene.control.ListView?> 
<?import javafx.scene.control.Menu?> 
<?import javafx.scene.control.MenuBar?> 
<?import javafx.scene.control.MenuItem?> 
<?import javafx.scene.control.SplitPane?> 
<?import javafx.scene.layout.AnchorPane?> 

<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="557.0" prefWidth="1012.0" style="-fx-background-color: #0288D1;" xmlns="http://javafx.com/javafx/9.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="desktop_tasker.FXMLTaskerController"> 
    <children> 
     <SplitPane dividerPositions="0.5811881188118811" layoutX="-8.0" layoutY="35.0" prefHeight="529.0" prefWidth="1027.0" style="-fx-background-color: #EEEEEE;" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="28.0"> 
     <items> 
      <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="160.0" prefWidth="100.0"> 
       <children> 
        <ListView fx:id="list_todo" layoutY="-8.0" prefHeight="527.0" prefWidth="584.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" /> 
       </children> 
      </AnchorPane> 
      <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="160.0" prefWidth="100.0"> 
       <children> 
        <ListView fx:id="list_done" layoutY="14.0" prefHeight="527.0" prefWidth="420.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" /> 
       </children></AnchorPane> 
     </items> 
     </SplitPane> 
     <MenuBar prefHeight="30.0" prefWidth="1012.0"> 
     <menus> 
      <Menu mnemonicParsing="false" text="File"> 
      <items> 
       <MenuItem mnemonicParsing="false" text="Close" /> 
      </items> 
      </Menu> 
      <Menu mnemonicParsing="false" text="Edit"> 
      <items> 
       <MenuItem mnemonicParsing="false" text="Delete" /> 
      </items> 
      </Menu> 
      <Menu mnemonicParsing="false" text="Help"> 
      <items> 
       <MenuItem mnemonicParsing="false" text="About" /> 
      </items> 
      </Menu> 
     </menus> 
     </MenuBar> 
    </children> 
</AnchorPane> 

당신은 내가 controler를 사용하려고 볼 수 있듯이과 :

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

<?import javafx.scene.control.Button?> 
<?import javafx.scene.control.Hyperlink?> 
<?import javafx.scene.control.Label?> 
<?import javafx.scene.control.PasswordField?> 
<?import javafx.scene.control.Separator?> 
<?import javafx.scene.control.TextField?> 
<?import javafx.scene.layout.AnchorPane?> 
<?import javafx.scene.text.Font?> 

<AnchorPane prefHeight="400.0" prefWidth="500.0" style="-fx-background-color: #0288D1; -fx-border-color: #01579B; -fx-border-width: 5;" xmlns="http://javafx.com/javafx/9.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="desktop_tasker.FXMLDocumentController"> 
    <children> 
     <Label layoutX="215.0" layoutY="34.0" text="Sign In" textFill="WHITE"> 
     <font> 
      <Font size="23.0" /> 
     </font> 
     </Label> 
     <Hyperlink fx:id="link_login" layoutX="150.0" layoutY="269.0" onAction="#handleButtonAction" text="Not registered yet? Click here." textFill="WHITE" /> 
     <TextField fx:id="et_username" layoutX="21.0" layoutY="102.0" prefHeight="25.0" prefWidth="425.0" promptText="Username" style="-fx-prompt-text-fill: #ffffff; -fx-background-color: #0288D1;" /> 
     <Separator layoutX="27.0" layoutY="126.0" prefHeight="3.0" prefWidth="425.0" /> 
     <Separator layoutX="27.0" layoutY="192.0" prefHeight="3.0" prefWidth="425.0" /> 
     <Button fx:id="btn_signup" layoutX="27.0" layoutY="222.0" mnemonicParsing="false" onAction="#handleButtonAction" prefHeight="23.0" prefWidth="425.0" style="-fx-background-color: #FFA000; -fx-prompt-text-fill: #ffffff;" text="SignUp" textFill="WHITE" /> 
     <PasswordField fx:id="et_password" layoutX="21.0" layoutY="167.0" prefHeight="25.0" prefWidth="425.0" promptText="Password" style="-fx-background-color: #0288D1; -fx-prompt-text-fill: #ffffff;" /> 
    </children> 
</AnchorPane> 

그리고 다른 하나

public class FXMLTaskerController implements Initializable { 


    @FXML private ListView list_todo; 
    @FXML private ListView list_done; 
    @FXML public String username; 

    private void handleButtonAction(ActionEvent event) { 


    } 

    @Override 
    public void initialize(URL url, ResourceBundle rb) { 
     System.out.println(username); 
     list_todo.setCellFactory(new TaskCellFactory()); 
     list_done.setCellFactory(new TaskCellFactory()); 
     try { 
      getTasks(); 
     } catch (IOException ex) { 
      Logger.getLogger(FXMLTaskerController.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 



    public void setUser(String username){ 
     this.username = username; 
    } 

    public void getTasks() throws IOException{ 
     Conector con = new Conector(); 
     for(Task task: con.obtenerTareas("pepin")){ 
      System.out.println(task); 
      if(task.isState()){ 
       list_done.getItems().add(task); 
      }else{ 
       list_todo.getItems().add(task); 
      } 
     } 
    } 
} 

그리고 여기에는 fxml 파일입니다 문자열을 pasing, 문제는 내가 새로운 장면을 열 때, 그의 컨트롤러가 재설정하고 문자열이 더 이상, 어떤 생각이 왜 또는 어떻게 해결할 수 없다는 것입니다?

+0

만약 내가이 오류가 발생 : 원인 : javafx.fxml.LoadException : 컨트롤러 값이 이미 지정되었습니다. Pane의 라인에서 myPane = (Pane) myLoader.load(); –

+0

그것은 그것을 고쳤다! 고맙습니다! –

+0

나는 JavaFX가 아니라고 확신한다. JAvaFX – ice1000

답변

1

는 다른, FXMLTasker.fxml에서 fx:controller="desktop_tasker.FXMLTaskerController"을 제거 또한 Pane myPane = (Pane)myLoader.load();를 호출하기 전에 당신이 그것을 수행해야 myLoader.setController(controler);와 컨트롤러를 설정하고 싶은 경우에 당신이 LoadException: Controller value already specified.

페이지의 JavaDoc FXMLLoader.setController(Object controller)을 얻을 :

이 연결된 컨트롤러를 설정합니다 루트 객체와 함께. 이 메소드에 전달 된 값은 fx : controller 속성의 값으로 사용됩니다. 문서에서 fx : controller 속성을 지정하지 않은 경우 컨트롤러 이벤트 핸들러를 사용할 때 문서를로드하기 전에이 메서드를 호출해야합니다.

FXMLTaskerController controler = (FXMLTaskerController)myLoader.getController(); 
controler.setUser(et_username.getText()); 

를하지만하여 당신은 usernameinitialize(URL url, ResourceBundle rb)에 설정하고 거기에서 제거해야한다고 가정 할 수 없습니다


또는 당신 FXMLLoader에서 컨트롤러를 요청할 수 있습니다.

관련 문제