2014-09-05 3 views
0

기본적으로 다른 여러 JavaFX 컨트롤이 합쳐진 JavaFX 컨트롤이 있습니다.Scene Builder로 가져 오기 위해 JavaFX 컨트롤을 어떻게 설정합니까?

다른 모든 컨트롤처럼 사용할 수 있도록 .jar 파일을 씬 빌더로 가져올 수 있기를 바랍니다. 내가 생각할 수있는 가장 가까운 유추는 C#에서 사용자 지정 컨트롤을 만들고 여러 프로젝트에서 여러 번 사용하는 경우입니다.

FXML 파일을 가져 오려고하면 작동하지 않습니다. 컨트롤은 단일 엔티티로 처리되지 않고 대신 기본적으로 FXML 파일에 겹쳐져있는 부분입니다.

씬 빌더가 .jar 파일을 가져 와서 컨트롤을보고 각 파일을 가져오고 사용할 수 있도록하기 위해 FXML 파일 또는 controller.java 파일로해야 할 일은 무엇입니까? 단일 엔터티로 사용자 지정 컨트롤? 나는 몇 군데를 보았고 전에 Stack Overflow에 대해서도 물어 보았다. (내가 얻은 대답은 내가 찾지 못했고 아무 응답도받지 못했다.) 그러나 내가 보지 못한 것은 내 문제를 다루는 것에 가깝다. .

내가 왔어요 가장 가까운이 FXML 파일에서이 라인과 관련이있다

:

<?scenebuilder-classpath-element /path/to/something?> 

하지만 초기화에서, 나는 내가 할 수있는 알고 /path/to/something

에서 잘 알 수없는 , 장면에 컨트롤을 추가하기 만하면됩니다. 그러나 이것은 필자가 필사적으로 피하려고 시도하고있는 차선책과 뭔가입니다.

+0

이 질문을 본 사람이 있습니까? http : // stackoverflow.com/questions/19342259/how-to-create-multiple-javafx-controllers-with-different-fxml-files Rafael –

+0

나는 그들이 할 수있는 것을보고, 내가 유일하게 말할 수있는 한 코드를 관찰한다. 내가 놓친 것은 컨트롤러를 FXML로 선언하는 것이 었습니다 (이제는 Scene Builder를 통해 컨트롤러를 작성했습니다). .jar 파일을 컴파일하고 다시 가져 오려고했습니다. 나는 아무것도 없어. 그것은 항아리를 열고 가져올 아무것도주지 않았다. 그래서 제가 컨트롤러를 선언하지 않았다는 것을 알게되었지만 여전히 문제를 해결하는 데 도움이되지 못했습니다. 그래도 감사합니다. – Will

+0

그런 다음이를 확인하십시오. http://stackoverflow.com/questions/16673407/javafx-custom-control-textfield-not-working –

답변

0

마지막으로 문제를 해결할 수있었습니다. 많은 시행 착오 끝에 그리고 here에서 나온 샘플 코드를 따르면서 FXML 컨트롤 그룹마다 2 개의 클래스가 필요하다는 것이 발견되었습니다. 하나는 그룹의 실제 컨트롤러이고 다른 하나는 컨트롤러를 수용 할 개체입니다. 잠금 해제 예제에서 코드를 따랐고 나를 도와 준 신의 선물이었습니다.

(내 경우, 루트 노드의 유형을 확장) 목적 : 당신이 컨트롤러 클래스를 필요로 그 후

public class <InsertObjectClassNameHere> extends <RootContainerTypeHere>{ 
} 

는 기본적으로 두 개의 파일로 내려 온다. 이것은 내가 가장 잘 알고있는 것입니다. 그러나 나는 아직도 잘못하고 있습니다. 이 implement initializable에 필요한 사항입니다 :이 같은 개체 클래스가 보이는 나를 위해 그래서

public class <InsertControllerClassNameHere> implements Initializable{ 

} 

:

public class DGCSDefiner extends GridPane { 
    private final DGCSDefinerController Controller; 
    public DGCSDefiner(){ 
     this.Controller = this.Load(); 
    } 

    private DGCSDefinerController Load(){ 
     final FXMLLoader loader = new FXMLLoader(); 
     loader.setRoot(this); 
     loader.setClassLoader(this.getClass().getClassLoader()); 
     loader.setLocation(this.getClass().getResource("DGCSDefiner.fxml")); 

     try{ 
      final Object root = loader.load(); 
      assert root == this; 
     } catch(IOException ex){ 
      throw new IllegalStateException(ex); 
     } 

     final DGCSDefinerController cntrlr = loader.getController(); 
     assert cntrlr != null; 
     return cntrlr; 
    } 

    /** 
    * Get the settings defined by the controller. 
    * @return controller defined settings. 
    */ 
    public ColorSettings getColorSettings(){ 
     return this.Controller.getColorSettings(); 
    } 

    /** 
    * Set the controllers color settings. 
    * @param CS Defined color settings. 
    */ 
    public void setColorSettings(ColorSettings CS){ 
     this.Controller.setColorSettings(CS); 
    } 
} 

하고 실제 컨트롤러 클래스가있다. 그래서 솔직 답변

,

당신이 컨트롤러를 로딩 될 클래스가 필요하고, 당신이있는 당신이 일하게 될 것이라는 점을 그 클래스에 컨트롤러에서 아래로 전달해야 (또는 컨트롤러를 공용으로 유지하고 직접 액세스 할 수 있습니다).

관련 문제