2016-09-19 7 views
1

헤더와 메뉴가있는 HomeScene.fxml 파일이있는 앱이 있습니다. HomeScene에는 dashboardPane도 있으며 메뉴 버튼을 누른 후 동적으로 변경해야합니다. 대시 보드 창 콘텐츠는 다른 fxml 파일에서로드해야합니다 (예 : 'FinancesPane.fxml'또는 'SettingsPane.fxml'). HomeController에 dashboardPane의 내용을 대체하려고JavaFX 현재 FXML 컨텐츠를 삽입하는 방법

임 :

@FXML 
public void handleFinancesButtonAction() { 
    FinancesPaneFactory paneFactory = new FinancesPaneFactory(); 
    dashBoardPane.getChildren().clear(); 
    dashBoardPane.getChildren().add(paneFactory.createPane()); 
} 

내 FinancesPaneFactory은 다음과 같습니다가 : HomeScene :

public class FinancesPaneFactory extends PaneFactory { 

    private static final String PANE_TEMPLATE_PATH = "/sceneTemplates/FinancesPane.fxml"; 

    public FinancesPaneFactory() { 
     super(PANE_TEMPLATE_PATH); 
    } 

    @Override 
    protected Pane generatePane(FXMLLoader loader) { 
     try { 
      return (Pane) loader.load(); 
     } catch (IOException e) { 
      throw new FatBirdRuntimeException("Unable to load FinancesPane", e); 
     } 
    } 

} 

이 HomeScene의 모습을 어떻게 더 명확합니다. 이 빈 공간은 dashboardPane이므로 사용자가 왼쪽 메뉴 버튼을 누르면 다른 내용으로 바꿔야합니다.

이 콘텐츠를 동적으로 주입하는 방법은 무엇입니까?

@FXML 
private ScrollPane dynamicNode; 

스크롤 창은 좋은 선택이다 :

+1

dashBoardPane은 BorderPane입니까? 그렇다면 dashBoardPane.setCenter (pane)와 같은 메소드를 사용해야합니다. – BadVegan

+0

dashBoardPane은 AnchorPane입니다. –

답변

1

예, 당신이 그래프 저 장면을 유지하기 위해이 작업을 수행해야하며 더 나은 성능 도움이됩니다, 내가 무엇을 동적 컨테이너를 만드는 것입니다.

이것은 MainController에 저장됩니다. 당신이 전화 무엇이든 메인 프로그램 클래스 있도록

내가 다른 사람과 다른 메인 컨트롤러를 가지고는, 메인 컨트롤러는, 사실은 내가 초기화 유일한 하나입니다

private static MainViewController mainViewController; 

을 ...

private static BorderPane loadMainPane() throws IOException { 

     FXMLLoader loader = new FXMLLoader(); 
     loader.setController(mainViewController); 
     BorderPane mainPane = (BorderPane) loader.load(
       CsgoRr.class 
       .getResourceAsStream(Info.Resource.FXML_FILE_MAIN)); 
     mainPane.getStylesheets().add(CsgoRr.class.getResource("path...style.css").toString()); 

     return mainPane; 
    } 

그나마 정적 접근자를 만드는 것을 잊지 마라. 일반적으로이 방법으로 만들지 않은 다른 컨트롤러는 fxml의 컨트롤러를 사용하여 어떤 컨트롤러가 어떤 fxml이되어야 하는지를 지정한다.이 컨트롤러는 일반적으로 mainController에 액세스 할 수 있어야한다.

따라서 귀하의 의견은 당신이보기 변경, 그와 메뉴에 연결되어 메인 컨트롤러 방법에서 만든 변경

dynamicNode에서 현재
@FXML 
private void setViewPreferences() { 
    setView(Info.Resource.FXML_FILE_PREFERENCES); 
} 

@FXML 
private void setViewProductPage() { 
    setView(Info.Resource.FXML_FILE_PRODUCT_PAGE); 
} 

는 도우미가 정확히 현재 선택된 것이 무엇인지 알아보기 위해서는 그

입니다 여기
private String currentlyInDynamicPane;//not important 

은 setView

public void setView(String fxmlPath) { 
     dynamicNode.setContent(getView(fxmlPath)); 
      currentlyInDynamicPane = fxmlPath; 
    } 


    public Node getView(String fxmlPath) { 
     try { 
      return new FXMLLoader(getClass().getResource(fxmlPath)).load(); 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
      return null; 
     } 
    } 

그래서입니다 FXML 파일을 스왑하는 왼쪽 메뉴를 클릭하면 시작시 또는 메뉴에 아무 것도 선택되어 있지 않을 때 기본 FXML이 표시되도록 할 수 있습니다.

대략적인 방법입니다.

대시 보드를 DynamicPane으로 생각하면