2014-06-30 1 views
3

저는 SceneBuilder와 Java FX의 사용자 정의 컨트롤 처리 방법에 대해 끝내 왔습니다.SceneBuilder 사용자 정의 컨트롤 클래스 경로

  1. fx : root를 사용합니까, 아니면 사용하지 않습니까? 나는 그것을 사용하기로했다. 따라서 컨트롤러의 컨트롤러 + 루트 클래스 내에서, 나는 단지 루트 및 컨트롤러로 설정합니다. 그러나 여전히 "루트는 이 설정되지 않았습니다.로드하기 전에 setRoot() 메서드를 사용하십시오."

  2. 사용자 지정 컨트롤이 포함될 상위 FXML 내에서 은 무엇입니까?

  3. 올바른 사용자 정의 컨트롤을 SceneBuilder 2.0에 표시 할 수있는 올바른 클래스 경로는 무엇입니까? 나는 "/.../.../.../bin"을 전혀 이해하지 못합니다.

  4. <fx:include> 태그가있는 경우 <MyCustomControl /> 마크 업에서 더 이상 사용할 필요가 있습니까?

지금까지 사용자 정의 컨트롤은 진행률 표시기에 지나지 않았습니다.

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

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


<fx:root type="HBox" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8"> 
    <children> 
     <ProgressBar fx:id="progressBar" prefWidth="200.0" progress="0.0" /> 
    </children> 
</fx:root> 

package application.ctrl; 

import java.io.IOException; 

import javafx.fxml.FXML; 
import javafx.fxml.FXMLLoader; 
import javafx.scene.control.ProgressIndicator; 
import javafx.scene.layout.HBox; 
import application.Main; 

자사의 컨트롤러 :

public class ProgressSelector extends HBox { 

    @FXML 
    private ProgressIndicator progressBar; 



    public ProgressSelector() { 
     FXMLLoader loader = new FXMLLoader(getClass().getResource(
       Main.PROGRESS_SELECTOR)); 
     loader.setRoot(this); 
     loader.setController(this); 
     loader.setClassLoader(this.getClass().getClassLoader()); 
     try { 
      loader.load(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

부모 FXML :

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

<?import javafx.scene.text.*?> 
<?import javafx.geometry.*?> 
<?import java.lang.*?> 
<?import javafx.scene.control.*?> 
<?import javafx.scene.layout.*?> 
<?import javafx.scene.layout.VBox?> 
<?import application.ctrl.ProgressSelector?> 

<VBox fx:id="vbox" spacing="5.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.ctrl.ObjectiveEditorCtrl"> 
    <children> 
     <HBox> 
     <children> 
      <Button mnemonicParsing="false" onAction="#back" text="&lt;" /> 
      <Label text="Editing Objective:" /> 
     </children> 
     </HBox> 
     <TextField fx:id="objectiveName" /> 
     <ProgressSelector /> 
     <HBox> 
     <children> 
      <Label text="Planned Start:" /> 
      <Region HBox.hgrow="ALWAYS" /> 
      <DatePicker fx:id="plannedStart" /> 
     </children> 
     </HBox> 
     <HBox> 
     <children> 
      <Label text="Actual Start:" /> 
      <Region HBox.hgrow="ALWAYS" /> 
      <DatePicker fx:id="actualStart" /> 
     </children> 
     </HBox> 
     <HBox> 
     <children> 
      <Label text="Planned Finish:" /> 
      <Region HBox.hgrow="ALWAYS" /> 
      <DatePicker fx:id="plannedFinish" /> 
     </children> 
     </HBox> 
     <HBox> 
     <children> 
      <Label text="Actual Finish:" /> 
      <Region HBox.hgrow="ALWAYS" /> 
      <DatePicker fx:id="actualFinish" /> 
     </children> 
     </HBox> 
     <HBox alignment="CENTER_RIGHT"> 
     <children> 
      <Button mnemonicParsing="false" onAction="#save" text="Save" /> 
      <Button mnemonicParsing="false" onAction="#back" text="Cancel" /> 
     </children> 
     </HBox> 
    </children> 
    <padding> 
     <Insets bottom="5.0" left="5.0" right="5.0" top="5.0" /> 
    </padding> 
</VBox> 

자사의 컨트롤러 : 여기

package application.ctrl; 

import interfaces.ControlledScreenInterface; 

import java.net.URL; 
import java.util.ResourceBundle; 

import javafx.fxml.FXML; 
import javafx.fxml.Initializable; 
import javafx.scene.control.DatePicker; 
import javafx.scene.control.TextField; 
import javafx.scene.layout.VBox; 
import application.ScreenController; 
import application.objects.Objective; 

public class ObjectiveEditorCtrl implements Initializable, 
     ControlledScreenInterface { 

    @FXML 
    private TextField objectiveName; 
    @FXML 
    private ProgressSelector completion; 
    @FXML 
    private DatePicker plannedStart; 
    @FXML 
    private DatePicker plannedFinish; 
    @FXML 
    private DatePicker actualStart; 
    @FXML 
    private DatePicker actualFinish; 
    @FXML 
    private VBox vbox; 

    private ScreenController parent; 
    private Objective current; 



    @Override 
    public void initialize(URL location, ResourceBundle resources) { 
     // TODO Auto-generated method stub 

    } 



    public void init(Objective current) { 
     this.current = current; 
     objectiveName.setText(current.getName()); 
     // completion.setProgress(current.getCompletion()); 
     plannedStart.setValue(current.getPlannedStart()); 
     actualStart.setValue(current.getActualStart()); 
     plannedFinish.setValue(current.getPlannedFinish()); 
     actualFinish.setValue(current.getActualFinish()); 
    } 



    public void save() { 
     // current.setName(objectiveName.getText()); 
     // // current.setCompletion(completion.getProgress()); 
     // current.setPlannedStart(plannedStart.getValue()); 
     // current.setPlannedFinish(plannedFinish.getValue()); 
     // current.setActualStart(actualStart.getValue()); 
     // current.setActualFinish(actualFinish.getValue()); 
     // back(); 
    } 



    public void back() { 
     parent.back(); 
    } 



    @Override 
    public void setParentScreen(ScreenController parent) { 
     this.parent = parent; 
    } 
} 

답변

2

많은 질문입니다.

1 - FX를 사용 : 그것은 모두에서 잘 작동하지 않습니다 SceneBuilder 2, 그러나 How to create multiple javafx controllers with different fxml files?

: 루트 당신이 FXMLLoader을 사용자 정의 할 수 있습니다, 당신은 당신이 구성 요소를 실체화하는 방식을 변경할 수 있습니다! 장면 빌더 2 (1로 잘 작동 함)로 "캐 노닉"방식은 fx : root를 사용하지 않는 것처럼 보입니다.

2 - 선택한 패턴에 따라 다릅니다. 명시 적 가져 오기를 사용하거나 FXML : include를 사용하여 FXML에서 사용자 정의 Java 구성 요소가 될 수 있습니다. FXML 먼저 컨트롤러. 또는 추상 구성 요소 (및 컨트롤러를 fx : root로) 다음 FXML.

3 - SceneBuilder 2는 각 사용자 정의 구성 요소가 고유 한 클래스 로더로로드되므로 클래스 로더에 많은 문제가 있습니다. 이는 예외처럼 발견되지 않는 클래스로 많이 실행된다는 것을 의미합니다. 이 문제를 해결하는 한 가지 방법은 SceneBuilder를 포크하여 모든 맞춤 구성 요소에 대해 하나의 클래스 로더 만 사용하도록하는 것입니다. Custom Components in Scenebuilder 2.0

또는 수정 사항을 기다리는 중입니다. 또는 fx : root를 사용하지 않고 fx : include를 선호합니다. 또는 Scene Builder를 사용하지 않고 많은 유효한 솔루션을 제공합니다.