2014-09-17 5 views
0

swing 구성 요소 안에 jfxPanel을 사용하여 응용 프로그램을 만들었습니다. 내가 직면하고있는 문제는 fxml 파일을 변경할 수 없다는 것입니다. fxml 버튼을 클릭하면 해당 fxml을 삭제하고 다른 fxml 파일을로드하려고합니다. 이것은 내가 지금fxml 파일 간 전환

public class NonResponsiveButtons extends JFrame { 
    NonResponsiveButtons nrb; 
    BottomPanelIncomingController bpic; 
    JPanel panel; 
    JPanel bPanel; 

    private int applicationWidth_600 = 600; 
    private int applicationHeight_600 = 600; 

    private int upperPanelHeight_535 = 535; 
    private int bottomPanelHeight_65 = (applicationHeight_600-upperPanelHeight_535); 


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



    public NonResponsiveButtons(){ 
     final JFXPanel fxPanel = new JFXPanel(); 

     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
      // TODO Auto-generated method stub 
       try{ 
        new JFXPanel(); 
        add(getJPanel(), BorderLayout.CENTER); 
        add(getJBottomPanel(), BorderLayout.PAGE_END); 
        bPanel.add(fxPanel, BorderLayout.CENTER); 

        Platform.runLater((new Runnable() { 

        @Override 
        public void run() { 
         // TODO Auto-generated method stub 
         initFX(fxPanel);  
        } 
       })) ; 

      } 
       catch(Exception e){ 
        System.out.println("Error in swing utilities thread :" + e.getMessage()); 
      } 

     } 
    }); 

    this.setSize(applicationWidth_600, applicationHeight_600); 
    setLocationRelativeTo(null); 
    BorderLayout borderLayout = new BorderLayout(); 
    setLayout(borderLayout); 

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
    setVisible(true); 
} 


private void initFX(JFXPanel jfxPanel) { 
    try { 
     FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("fxmlDesign.fxml")); 
     Parent root = (Parent) fxmlLoader.load(); 
     Scene scene = new Scene(root, 600, 65); 
     jfxPanel.setScene(scene); 

     fxmlLoader.getController(); 
     bpic = new BottomPanelIncomingController(); 
     bpic.setNonResoinsiveButtons(this); 

    } catch (IOException exc) { 
     exc.printStackTrace(); 
     System.exit(1); 
    } 
} 

public void loadSecondFxml(){ 
    System.out.println("loading second fxml"); 
} 

private JPanel getJPanel(){ 
    if(panel == null){ 
    panel = new JPanel(); 
    panel.setSize(applicationWidth_600,upperPanelHeight_535); 
    panel.setBackground(Color.gray); 
    } 
    return panel; 
} 

private JPanel getJBottomPanel(){ 
    if(bPanel == null){ 
     bPanel = new JPanel(); 
     bPanel.setSize(applicationWidth_600, bottomPanelHeight_65); 
     bPanel.setBackground(new Color(8, 16, 19)); 
    } 
    return bPanel; 
} 

}

BottomPanelIncommingController 클래스까지 한 일이다. 작업이 컨트롤러가 FXMLLoader에 의해 이루어집니다 인스턴스화 때문에 FXML을 사용하는 경우 fxml 컨트롤러

public class BottomPanelIncomingController implements Initializable { 
NonResponsiveButtons nrb; 

    @Override 
    public void initialize(URL arg0, ResourceBundle arg1) { 
    // TODO Auto-generated method stub 
    System.out.println("HEllo"); 
    } 

    public void setNonResoinsiveButtons(NonResponsiveButtons nrb){ 
    this.nrb = nrb; 
    } 

    @FXML 
    public void callAccepted(ActionEvent event){ 
    System.out.println("From controller"); 
    nrb.loadSecondFxml(); 
    } 
} 
+0

무엇이 문제입니까? 어떤 오류/예외가 있습니까? – ItachiUchiha

+0

널 포인터 예외. BottomPanelIncomingController 클래스의'setNonResoinsiveButtons (NonResponsiveButtons nrb)'에있을 때. 내 질문을 편집하고 내 질문에 BottomPanelIncomingController 코드를 추가했습니다. – viper

+0

항상 컨트롤러를 fxml 밖으로 가져와야합니다. 'bpic = new BottomPanelIncomingController(); '대신'bpic = fxmlLoader.getController();'를 사용하십시오. – ItachiUchiha

답변

0

당신은 new와 컨트롤러의 인스턴스를해서는 안됩니다. 컨트롤러를 인스턴스화하는 동안 FXML에있는 노드의 인스턴스를 만들어 컨트롤러에 삽입합니다.

컨트롤러 인스턴스를 FMXLLoader에서 가져 오지 않으면 @FXML으로 주석 된 컨트롤러의 모든 노드가 null이됩니다. 따라서 항상 fxml에서 컨트롤러를 가져와야합니다.

귀하의 경우에는

, 당신은) (

BPIC = fxmlLoader.getController를 사용한다; 대신

BPIC = 새로운 BottomPanelIncomingController의

();

업데이트

우리는 다음과 같은 방법 당신은로드 할 수 있습니다

@FXML 
public void callAccepted(ActionEvent event){ 
    System.out.println("From controller"); 
    nrb.loadSecondFxml(); 
} 

을 클릭 버튼라고 생각 해보자 버튼의 클릭에 FXML을 변경하려면 FXML로 설정하고 장면에 설정 한 다음 JFXPanel

public void loadSecondFxml(){ 
    //Load new FXML and assign it to scene 
    FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("newFXML.fxml")); 
    Parent root = (Parent) fxmlLoader.load(); 
    Scene scene = new Scene(root, 600, 65); 
    jfxPanel.setScene(scene); 
} 

참고 : 난 당신이 여기에 달성하려는 것을 확실하지 않다, 예를 들어 버튼의 클릭에 단지에 부하 FXML을이 고려하고 논리를 적용 할 수 있습니다.

+0

감사합니다. 처음에는 jfxpanel의 현재 구성 요소를 제거한 다음 다른 fxml 파일을로드해야한다고 가정했지만이 작업은 효과적이었습니다. 마지막 질문 하나, 이전 fxml 파일 객체가 여전히 존재합니까? 아니면 삭제 되었습니까?수동으로 처리하지 않았 음을 알려드립니다. – viper

+0

폐기 될 것입니다. – ItachiUchiha