2016-08-05 2 views
0

내 GUI를 FXML로 완전히 정의하고 싶습니다. 필자는 오라클 워드 프로세서에서 넷빈즈 템플릿까지 어디에서나 볼 수있는 JavaFX 템플릿부터 시작했습니다. 이 템플릿에는 FXML로 정의 된 스테이지가 없으며 UI 컨트롤이있는 실제 Scene 만 있습니다. 뭔가 같은 :FXML에서 Stage를 정의하는 방법은 무엇입니까?

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

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

<AnchorPane id="AnchorPane" prefHeight="200" prefWidth="320" xmlns:fx="http://javafx.com/fxml/1" fx:controller="fxskuska.FXMLDocumentController"> 
    <children> 
     <Button layoutX="126" layoutY="90" text="Click Me!" onAction="#handleButtonAction" fx:id="button" /> 
     <Label layoutX="126" layoutY="120" minHeight="16" minWidth="69" fx:id="label" /> 
    </children> 
</AnchorPane> 

내가 먼저 변경하고 싶을 때까지 괜찮아 보였다 - 창 이름을 설정합니다. Scene이 Window (또는 JFrame 비유)가 아니라는 것을 깨달았지만 Stage가 있습니다. 이 요소를 모두 요소 안에 감싸려고하면 더 이상 루트 요소가 아니기 때문에 AnchorPane에 fx:controller 특성을 설정할 수 없습니다. 스테이지 파일에서 fx:include을 사용하여 "아웃소싱"하려고했으나 "예상치 못한 종료 태그 : 장면"오류가 발생했습니다.

  1. FXML에서 Stage를 정의하는 방법은 무엇입니까?
  2. Stage는 JFrame과 유사합니까?
+1

* "더 이상 루트 요소가 아니기 때문에 AnchorPane에 fx : controller 속성을 설정할 수 없습니다."* 속성을 루트 요소로 옮기는 것이 어떨까요? – fabian

+0

루트 (스테이지)에 컨트롤러 속성이 없으므로 루트로 이동할 수 없습니다 – Leprechaun

+1

속성으로 속성을 설정하지 않습니다. 이 요소는 단지 컨트롤러를 생성하기 위해 FXMLLoader가 사용하는 클래스를 정의합니다 AnchorPane은 컨트롤러 속성도 가지고 있지 않습니다 –

답변

2

FXML은 기본적으로 (일반적으로 인수가없는 생성자를 통해) 객체를 만드는 방법을 정의하고 해당 객체에 setXXX 메소드를 호출합니다. 설명서에서 "Class instance elements""Property elements"을 참조하십시오. 그래서 당신은 쉽게

<Stage>...</Stage> 

<Scene>...</Scene> 

new Stage() 

new Scene() 

을 구현할 수 있습니다 루트 요소에 가야한다

<Stage> 
    <scene> 
     <Scene> 
      <root> 
       <AnchorPane ><!--...--></AnchorPane> 
      </root> 
     </Scene> 
    </scene> 
<Stage> 

fx:controller 속성 와3210

Stage stage = new Stage(); Scene scene = new Scene(); scene.setRoot(new AnchorPane(...)); stage.setScene(scene); 

, 네임 스페이스 정보를 정상적으로.

그래서 :

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

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

<?import javafx.stage.Stage ?> 

<Stage title="My Application" xmlns:fx="http://javafx.com/fxml/1" 
    fx:controller="FXMLDocumentController"> 

    <scene> 

     <Scene> 

      <root> 

       <AnchorPane id="AnchorPane" prefHeight="200" prefWidth="320"> 
        <children> 
         <Button layoutX="126" layoutY="90" text="Click Me!" 
          onAction="#handleButtonAction" fx:id="button" /> 
         <Label layoutX="126" layoutY="120" minHeight="16" minWidth="69" 
          fx:id="label" /> 
        </children> 
       </AnchorPane> 

      </root> 
     </Scene> 

    </scene> 

</Stage> 

다음 당신은 당신이 컨트롤러가 특별히 창에 적용 할 경우, StageScene 하나 개 FXML 파일을 사용할 수 있습니다

import java.io.IOException; 

import javafx.application.Application; 
import javafx.fxml.FXMLLoader; 
import javafx.stage.Stage; 

public class FXMLStageTest extends Application { 

    @Override 
    public void start(Stage primaryStage) throws IOException { 
     Stage stage = FXMLLoader.load(getClass().getResource("Stage.fxml")); 
     stage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 

로이로드 것 다른 부분에 fx:include elements을 사용하십시오. 그렇게하면 UI를 여러 FXML 컨트롤러 쌍으로 나눌 수 있습니다. 그것은 (당신은뿐만 아니라 확실히 자바에서이 부분을 수행 할 수 있습니다) 단지 Stage에 대한 FXML 파일을 사용하는 중복 조금 느낌,하지만이 가능합니다 :

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

<?import javafx.scene.*?> 
<?import javafx.stage.Stage ?> 

<Stage title="My Application" xmlns:fx="http://javafx.com/fxml/1"> 

    <scene> 
     <Scene> 
      <root> 
       <fx:include source="RootPane.fxml"/> 
      </root> 
     </Scene> 
    </scene> 
</Stage> 

를 다음 원래 FXML 파일 RootPane.fxml입니다. 필요한 경우 추가로 fx:include 태그로 분해 할 수 있습니다.

+0

그러나 2 개 또는 그 이상의 Scenes를 가진 스테이지를 원한다면 각각 컨트롤러를 가지고 있습니다. ? 루트 요소 (스테이지)에 fx : 컨트롤러를 설정하면 모든 장면에서 컨트롤러를 사용하게하지 않습니까? – Leprechaun

+0

@Leprechaun 단일 스테이지에서 둘 이상의 'Scene'을 설정할 수없고 fxml만으로 'Stage'의 'Scene'을 대체 할 수 없습니다. fxml에서 아무것도 프로그래밍하지 마세요. 구조체를 정의하고 있습니다. 더 복잡한 경우에는 여전히 자바 코드를 사용해야합니다. – fabian

+0

@Leprechaun 다중 F XML 파일은'fx : include' 요소와 결합됩니다. 업데이트를 참조하십시오. FXML과 컨트롤러의 전체 개념을 이해하지 못한 것처럼 들립니다. 조금 더 연구하고 실험 해보길 권합니다. –

관련 문제