2014-04-25 108 views
0

我有一個標籤爲firstLabel的主屏幕。有一個按鈕openSecondWindow窗口交互性

按下該按鈕將打開一個新窗口,同時將第一個窗口留在屏幕上。

  • 如何鎖定第一個屏幕,以便用戶在第二個窗口關閉之前無法與其交互?

第二個窗口將有一個TextFieldButton setFirstLabel。當用戶在文本字段中輸入文本並點擊按鈕時,第一個窗口中的文本將被更改。

  • 我該如何從第二個窗口的控制器訪問第一個窗口的控制器類?

  • 如何確保一次只打開每個窗口的一個實例? (沒有重複)

回答

1

我爲你做了一個小例子。

如果您單擊按鈕上的第一階段以打開第二階段,該按鈕將被禁用,因此您無法再打開一個階段。

如果您在Stage2上的TextField中輸入了一些文本,並在此處點擊Update Button,則第1階段的TextField將被更新,第二階段將被關閉。

下面是代碼:

firstWindow.fxml

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

<?import java.lang.*?> 
<?import java.util.*?> 
<?import javafx.scene.control.*?> 
<?import javafx.scene.layout.*?> 
<?import javafx.scene.paint.*?> 

<AnchorPane id="AnchorPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2" fx:controller="de.professional_webworkx.jfx.twowindows.controller.FirstController"> 
    <children> 
    <TextField fx:id="textField" layoutX="50.0" layoutY="189.0" prefWidth="500.0" promptText="Waiting for input from second Stage..." /> 
    <Button fx:id="openBtn" layoutX="441.0" layoutY="304.0" mnemonicParsing="false" text="open 2 Stage" /> 
    </children> 
</AnchorPane> 

二FXML

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

<?import java.lang.*?> 
<?import java.util.*?> 
<?import javafx.scene.control.*?> 
<?import javafx.scene.layout.*?> 
<?import javafx.scene.paint.*?> 

<AnchorPane id="AnchorPane" fx:id="mainPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2" fx:controller="de.professional_webworkx.jfx.twowindows.controller.SecondController"> 
    <children> 
    <TextField fx:id="textField" layoutX="50.0" layoutY="66.0" prefWidth="243.0" promptText="Type some text" /> 
    <Button fx:id="updateBtn" layoutX="50.0" layoutY="118.0" mnemonicParsing="false" text="update Text on Stage 1" /> 
    </children> 
</AnchorPane> 

FirstController

package de.professional_webworkx.jfx.twowindows.controller; 

import java.io.IOException; 
import java.net.URL; 
import java.util.ResourceBundle; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.fxml.FXML; 
import javafx.fxml.FXMLLoader; 
import javafx.fxml.Initializable; 
import javafx.scene.Parent; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.TextField; 
import javafx.stage.Stage; 

/** 
* 
* @author Patrick Ott <[email protected]> 
* @version 1.0 
*/ 
public class FirstController implements Initializable { 

    @FXML 
    Button openBtn; 

    @FXML 
    TextField textField; 

    private boolean secondOpen; 
    private Stage secondStage; 

    FirstController firstController; 
    public FirstController() { 

    } 

    @Override 
    public void initialize(URL url, ResourceBundle rb) { 
     this.firstController = this; 
     System.out.println(firstController); 
     openBtn.setOnAction(new EventHandler<ActionEvent>() { 

      @Override 
      public void handle(ActionEvent t) { 
       if(!secondOpen) { 
        openBtn.setDisable(true); 
        try { 
         FXMLLoader loader = new FXMLLoader(getClass().getResource("second.fxml")); 
         Parent load = loader.load(); 
         SecondController controller = (SecondController) loader.getController(); 
         controller.setFirstController(firstController); 
         Scene scene = new Scene(load); 
         secondStage = new Stage(); 
         secondStage.setScene(scene); 
         secondStage.show(); 
         secondOpen = true; 
        } catch (IOException ex) { 
         Logger.getLogger(FirstController.class.getName()).log(Level.SEVERE, null, ex); 
        } 
       } 
      } 
     }); 
    } 

    public void updateText(final String text) { 
     this.textField.setText(text); 
    } 

    public void secondClosed() { 
     this.secondOpen = false; 
     this.openBtn.setDisable(false); 
     secondStage.close(); 
    } 
} 

SecondController

package de.professional_webworkx.jfx.twowindows.controller; 

import java.net.URL; 
import java.util.ResourceBundle; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.fxml.FXML; 
import javafx.fxml.Initializable; 
import javafx.scene.control.Button; 
import javafx.scene.control.TextField; 
import javafx.scene.layout.AnchorPane; 

/** 
* 
* @author Patrick Ott <[email protected]> 
* @version 1.0 
*/ 
public class SecondController implements Initializable { 

    @FXML 
    AnchorPane mainPane; 

    @FXML 
    TextField textField; 

    @FXML 
    Button updateBtn; 

    private FirstController firstController; 

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

     updateBtn.setOnAction(new EventHandler<ActionEvent>() { 

      @Override 
      public void handle(ActionEvent t) { 
       String text = textField.getText(); 
       firstController.updateText(text); 
       firstController.secondClosed(); 

      } 
     }); 
    } 

    public void setFirstController(final FirstController firstController) { 
     this.firstController = firstController; 
    } 
} 

並啓動它

package de.professional_webworkx.jfx.twowindows; 

import java.io.IOException; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javafx.application.Application; 
import javafx.fxml.FXMLLoader; 
import javafx.scene.Parent; 
import javafx.scene.Scene; 
import javafx.stage.Stage; 

/** 
* 
* @author Patrick Ott <[email protected]> 
*/ 
public class TwoStages extends Application { 

    @Override 
    public void start(Stage primaryStage) { 

     try { 
      Parent load = FXMLLoader.load(getClass().getResource("firstWindow.fxml")); 
      Scene scene = new Scene(load); 

      primaryStage.setTitle("Hello World!"); 
      primaryStage.setScene(scene); 
      primaryStage.show(); 
     } catch (IOException ex) { 
      Logger.getLogger(TwoStages.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     launch(args); 
    } 

} 

神奇的是,交出FirstController對象的SecondController,你是能夠更新第一舞臺上的文本字段。

希望這會有所幫助。

Patrick

+0

你是一個很棒的人。謝謝你。我認爲這不會涉及將控制器傳遞給自己。這是一個推薦的方法嗎? –

+0

也許你想看看Adam Bien的afterburnerfx庫,https://github.com/AdamBien/afterburner.fx,如果你將來在更大的項目中工作,這將對你非常有幫助,因爲我認爲在Swing中,它並不是處理活動JFrame和JavaFX的最佳方式,我認爲它並不是開啓2個或更多階段的最佳方式。 – Patrick

+0

我會的。非常感謝! –