2017-12-21 6 views
0

다른 단추를 클릭 할 때 나타나는 동일한 사용자 지정 팝업 창이 필요한 응용 프로그램을 작성하고 있습니다. 지금 팝업은 단순한 "Are You Sure? OK/Cancel"창이지만 나중에 더 많은 맞춤 기능을 포함하도록 확장되므로 Quickie Dialog 내장 기능을 사용할 수 없습니다.javaFX :: 팝업 창이 시작되지만 컨트롤러가 ...?

이상한 일이 있습니다. 버튼 X가 눌려지면 popUp (FXML에 정의 됨)이 정상적으로 시작되지만 컨트롤러 클래스가 실행되지 않는 것처럼 보입니다. 나는 네가 그렇게 할 수 있다고 생각하지 않았다. 내가 이해할 수없는 것은 입니다. 왜 컨트롤러가 실행되고 있지 않습니다. 컨트롤러가 작동하지 않으면 응용 프로그램이 다운 될 것이라고 생각했을 것입니다. 여기

'버튼이 팝업을 시작 호출 코드 :

private void popUpLaunch(Button caller){ 
    Stage popUpStage = new Stage(); 
    Parent root; 

    try { 
     root = FXMLLoader.load(getClass().getResource("popUp1.fxml")); 
     popUpStage.setScene(new Scene(root)); 
     popUpStage.initModality(Modality.APPLICATION_MODAL); // popup 
     popUpStage.initOwner(caller.getScene().getWindow()); 
     popUpStage.showAndWait(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

그 모든 잘 작동합니다. 여기 /src/sl/view/popUp1.fxml, 전체 FXML입니다 :

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

<?import javafx.scene.control.Button?> 
<?import javafx.scene.layout.AnchorPane?> 
<?import javafx.scene.text.Font?> 
<?import javafx.scene.text.Text?> 

<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="130.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sl.view.PopUp1Controller"> 
    <children> 
     <Text fx:id="popUpMessageText" layoutX="14.0" layoutY="14.0" strokeType="OUTSIDE" strokeWidth="0.0" text="Message Goes Here" textAlignment="CENTER" wrappingWidth="577.6708984375" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0"> 
     <font> 
      <Font size="38.0" /> 
     </font> 
     </Text> 
     <Button fx:id="btnPopUpOK" layoutX="126.0" layoutY="68.0" mnemonicParsing="false" prefHeight="31.0" prefWidth="157.0" text="OK" /> 
     <Button fx:id="btnPopUpCancel" layoutX="286.0" layoutY="68.0" mnemonicParsing="false" prefHeight="31.0" prefWidth="169.0" text="Cancel" /> 
    </children> 
</AnchorPane> 

창로드 잘. 그리고 마지막으로, 여기 /src/sl/view/PopUp1Controller.java, 전체 컨트롤러의 :

package sl.view; 
import javafx.fxml.FXML; 
import javafx.scene.control.Button; 
import javafx.scene.text.Text; 
import javafx.stage.Stage; 

public class PopUp1Controller { 
    @FXML Text popUpMessageText; 
    @FXML Button btnPopUpOK; 
    @FXML Button btnPopUpCancel; 
    Stage stage; 

    public void start(Stage stage) throws Exception{ 
     System.out.println("Popup controller launched!"); // never reach this... so the controller is not launching??? 
     this.stage = stage; 
     popUpMessageText.setText("Interesting message here!"); 
     btnPopUpOK.setOnAction(event -> { 
      System.out.println("You cliced OK..."); 
     }); 
     btnPopUpCancel.setOnAction(event -> { 
      System.out.println("You cliced Cancel"); 
      stage.close(); 
     }); 
    } 
} 

어떤 생각을 ...

은 내가 FXML를 생성하는 SceneBuilder을 사용했다. 해당 AnchorPane에 대한 컨트롤러 클래스를 할당 할 때 드롭 다운 메뉴에서 "sl.view.PopUp1Controller"를 선택했습니다. 그래서 나는 그것이 옳다는 것을 확신합니다.

다른 "JavaFX Popup"게시물을 살펴 봤지만 문제를 구체적으로 다루는 게시물이 보이지 않습니다. 게시물의 많은 "왜 이러한 다른 팝업 옵션을 사용하기보다는 바퀴를 재발견하지?", 기본적으로있는 아래 포스트처럼 예 : 내 경우 JavaFX 2 custom popup pane , 내가 가 재발견 싶어 바퀴는, 더 많은 기능을 수행하기 위해 팝업이 필요하기 때문에 간단한 대화 상자가 아닙니다. 당신이 컨트롤러가 초기화 될 때 실행 initialize() 방법에 넣어 컨트롤러에 코드를 원하는 경우

+0

은'(시작) '방법은 컨트롤러에 호출되지 않습니다 (왜 당신이 그것을 부르기를 기대합니까?). 코드를'initialize()'(인자 없음)라는 메서드에 넣기 만하면됩니다. [documentation] (https://docs.oracle.com/javase/9/docs/api/javafx/fxml/doc-files/introduction_to_fxml.html#controllers)를 참조하십시오. 또한 임의의 노드를 [content] (https://docs.oracle.com/javase/9/docs/api/javafx/scene)로 설정할 수 있으므로 내장 대화 상자가 원하는 것을 거의 확실하게 수행 할 수 있습니다. /control/DialogPane.html#contentProperty). –

답변

1

합니다 (documentation 참조)

public class PopUp1Controller { 
    @FXML Text popUpMessageText; 
    @FXML Button btnPopUpOK; 
    @FXML Button btnPopUpCancel; 

    public void initialize() { 
     System.out.println("Popup controller launched!"); // never reach this... so the controller is not launching??? 
     popUpMessageText.setText("Interesting message here!"); 
     btnPopUpOK.setOnAction(event -> { 
      System.out.println("You cliced OK..."); 
     }); 
     btnPopUpCancel.setOnAction(event -> { 
      System.out.println("You cliced Cancel"); 
      btnPopupCancel.getScene().getWindow().hide(); 
     }); 
    } 
} 
+0

굉장한, 그 매력처럼 작동합니다. 그리고 문서를 지적 해 주셔서 감사합니다. Java 응용 프로그램에서 수업을 듣고 있는데 Prof는이 소스를 언급하지 않았습니다. 나는 좋은 책을 좋아한다. – Pete