2015-01-02 5 views
1

JavaFX를 사용하기 시작했으며 SceneBuilder를 사용하여 GUI를 개발하고 있습니다. 내 자바 프로젝트에 다음과 같은 구조를 가지고 :JavaFX Scene Builder가 다른 패키지/컨트롤러에서 OnAction을 처리합니다.

src/ # Main class and other classes.. 
src/[package]/IndexClass 
src/[Another package]/ProductClass 
src/base.fxml # I am using this as a template 

base.fxml에서를, 나는 메뉴 항목을 포함하는 MenuBar 가지고하는 Button라는 btnNew 말할 수 있습니다. SceneBuilder에서 해당 버튼에 대한 onAction 이벤트 핸들러를 선언했으며 내부 메서드에 연결하려고합니다 ProductClass. 그러나 ProductClassbase.fxml과 다른 패키지에 있으며 base.fxml의 메뉴 항목에 대해 onAction을 클릭하면 빈 것으로 표시됩니다.

제 질문은 Scene Builder에서 컨트롤의 onAction 메서드를 .fxml 파일과 다른 패키지/네임 스페이스에있는 작업에 어떻게 연결할 수 있습니까?

더 많은 설명이 필요하면 알려주세요. 내 질문을 도표로 작성하는 데 시간이 좀 걸릴 것입니다.

답변

0

controller까지 FXML 파일을 연결해야합니다. FXML 페이지의 루트 노드에서

다음을 입력 문자열이 컨트롤러의 상대적 패키지 경로입니다

fx:controller="package.subpackage.ControllerName" 

. 컨트롤러가 FXML 파일과 다른 패키지에 있다면, 항상 소스 패키지에서 경로를 선언해야합니다. 또한 FXML 파일을 마우스 오른쪽 버튼으로 클릭하고 '컨트롤러 만들기'를 선택하여 Netbeans이이 작업을 수행하도록 할 수 있습니다. 당신이 어떤 된 객체 fx:id을 제공 한 경우이 같은 @FXML 태그를 선언하는 경우

, JavaFX는 컨트롤러로 주입됩니다 : 당신은 같은 방법으로 이벤트를 선언 할 수 있습니다

@FXML private Button btnNew; 

. 예를 들면 :

@FXML 
void btnNew_OnAction(ActionEvent event) { 
    //body 
} 

UPDATE :

나는 당신이 당신의 디자인을 재고해야한다고 생각. FXML 파일은 하나의 컨트롤러에만 연결할 수 있습니다. 메뉴 모음이있는 경우 해당 메뉴 모음에있는 단추의 동작이 관련되어있을 수 있습니다. 다른 컨트롤러 클래스로 그 동작을 구분하는 것은 좋지 않은 생각입니다. 내가 해결할 수있는 방법은 menubar의 모든 버튼에 대한 모든 이벤트를 처리하는 단일 컨트롤러를 갖는 것입니다.

컨트롤러를 어떻게 설정 했습니까? FXML은 MVC (Model-View-Controller)의 한 형태입니다. 보통 내가하는 일은 Model 레이어에서 모든 데이터를 컨트롤러에서 분리하는 것입니다. 그런 다음 컨트롤러가 데이터와 상호 작용하고 변경 사항을 수신 대기합니다. 그렇게하면 이벤트 핸들러가 특정 컨트롤러에서 퍼져 나갈 필요가 없습니다. 모든 컨트롤러가 모델 레이어에 액세스 할 수 있기 때문입니다. 나는 이것을 아주 잘 설명하는 this answer을 발견했다. 제어기에 Context 오브젝트를 주입합니다. 소규모 응용 프로그램을위한 좋은 솔루션이지만, 이런 식으로 하나님 객체를 만드는 것을 조심하십시오.:)

그렇다면 동일한 화면에서 다양한 GUI 요소에 대해 여러 컨트롤러를 사용하려는 경우 완전히 가능합니다. 그러나 각 컨트롤러마다 다른 FXML 파일이 있어야합니다. 이 답변을 살펴보면 문제가 아주 잘 처리됩니다 : creating multiple controllers.

+0

이 옵션에 대한 나의 관심은 버튼이 템플릿 FXML의 메뉴 막대에 있기 때문에 메뉴에 더 많은 버튼을 추가하고 버튼이 다른 컨트롤러 메소드에 액세스한다는 것을 확신합니다. 하나의 컨트롤러에 메뉴 막대가있는 FXML 다른 컨트롤러의 다른 메서드에 추가 할 단추의 나머지 부분을 연결할 수는 없을 것입니다. JavaFX의 구조를 오해하고있는 것 같지만 어쨌든 어떻게 접근할까요? –

+0

@BenjaminVison 내 대답을 확장했습니다. 이 질문에 대한 대답이 있거나 아직 명확하지 않은 것이 있으면 알려주십시오. –

+0

그것이 제가 생각한 것입니다. 도움을 주신 덕분에 컨트롤러가 모든 작업을 처리하도록하기 위해 내가하고있는 것을 다시 구조화 할 것입니다. –

관련 문제