JAVAFX

2017-11-28 10 views
2

JavaFXのシーン間にStringを渡そうとしていますが、すでにsome answersに従っていますが、新しいシーンで文字列がヌルであるため動作しないようです。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だ、私は私の文字列をしたい1:

は、ここに私のMainControlerです。

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ファイルです:あなたは、私がのcon​​trolerを使用しようとセットを使用して見ることができるように

<?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> 

<?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> 

そして、他の1問題は、私が新しいシーンを開くときに、彼のコントローラーがリセットされ、文字列はもはやそこにありません、それを解決するための理由や考え方はありますか?

+0

このエラーが発生した場合:原因:javafx.fxml.LoadException:コントローラ値がすでに指定されています。ペインの行にある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属性が指定されていないときにコントローライベントハンドラを使用するときにドキュメントをロードする前に呼び出す必要があります。


別の方法としては、FXMLLoaderからコントローラーを要求することができます

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

をしかし、それによって、あなたはusernameinitialize(URL url, ResourceBundle rb)に設定されており、そこから削除すべきであると仮定することはできません。

関連する問題