2014-09-17 6 views
0

Я создал приложение, использующее jfxPanel внутри компонента swing. Проблема, с которой я сталкиваюсь, заключается в том, что я не могу изменить файлы 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. Контроллер 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

null указатель исключение. Когда я в 'setNonResoinsiveButtons (NonResponsiveButtons nrb)' в классе BottomPanelIncomingController. Я отредактировал свой вопрос и добавил код BottomPanelIncomingController в своем вопросе – viper

+0

Вы должны всегда вывести контроллер из fxml. Используйте 'bpic = fxmlLoader.getController();' вместо 'bpic = new BottomPanelIncomingController();' – ItachiUchiha

ответ

0

Вы никогда не должны создать экземпляр контроллера с new при использовании FXML, потому что работа для создания экземпляра контроллера осуществляется с помощью FXMLLoader. При создании экземпляра контроллера он также создает экземпляры узлов, которые есть в FXML, и вводят их в контроллер.

Если вы не получили экземпляр контроллера из FMXLLoader, все ваши узлы внутри контроллера, аннотированные @FXML, будут иметь значение null. Поэтому вы всегда должны вывести контроллер из fxml.

В вашем случае, вы должны использовать

БПИК = fxmlLoader.getController();

вместо

БПИК = новый BottomPanelIncomingController();

Update

Чтобы изменить FXML по нажатию кнопки

Рассмотрим следующий метод вызывается кнопкой мыши

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

Вы можете загрузить 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 или он был удален?Coz мы не располагали его вручную – viper

+0

Он будет удален – ItachiUchiha

Смежные вопросы