2017-07-11 23 views
0

私はJavaFXアプリケーションを開発中です。私はメモ帳を書きたい。今私はメニューバーに取り組んでいます。私は、ファイルの管理、設定、編集などを担当して一つの大きなコントローラを持たないように、すべてのメニューのための一般的な一台のコントローラと複数の専門のコントローラを書きたいJavaFX:メニューコントローラを分割する方法は?

<?xml version="1.0" encoding="UTF-8"?> 

<?import javafx.scene.control.*?> 
<MenuBar id="menuBar" fx:id="menuBar" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="controllers.menu.MenuController"> 
    <menus> 
     <Menu id="fileMenu" fx:id="fileMenu" mnemonicParsing="false" text="File"> 
      <items> 
       <MenuItem id="newFileItem" fx:id="newFileItem" text="New Ctrl+N" /> 
       <MenuItem id="openFileItem" fx:id="openFileItem" text="Open Ctrl+O" onAction="#openFile" /> 
       <MenuItem id="saveFileItem" fx:id="saveFileItem" text="Save Ctrl+S" /> 
       <MenuItem id="saveFileAsItem" fx:id="saveFileAsItem" text="Save file as... Ctrl+S"/> 
      </items> 
     </Menu> 
     <Menu id="editionMenu" fx:id="editionMenu" mnemonicParsing="false" text="Edit"> 
     </Menu> 
     <Menu id="settingsMenu" fx:id="settingsMenu" mnemonicParsing="false" text="Settings"> 
     </Menu> 
     <Menu id="helpMenu" fx:id="helpMenu" mnemonicParsing="false" text="Help"> 
     </Menu> 
    </menus> 
</MenuBar> 

:これは私のMenu.fxmlファイルです。 これはMenuControllerある:

package controllers.menu; 

import javafx.fxml.FXML; 
import javafx.scene.control.MenuBar; 

public class MenuController { 

    @FXML 
    private MenuBar menuBar; 

    private FileMenuController fileMenuController; 
    private EditMenuController editMenuController; 
    private SettingsMenuController settingsMenuController; 
    private HelpMenuController helpMenuController; 

    public MenuController() { 
     fileMenuController = new FileMenuController(); 
     fileMenuController.setMenuBar(menuBar); 
    } 

    public void openFile(){ 
     fileMenuController.openFile(); 
    } 
} 

これはFileMenuControllerある:

package controllers.menu; 

import javafx.scene.control.MenuBar; 
import javafx.stage.FileChooser; 

import java.io.File; 
import java.net.URL; 
import java.util.ResourceBundle; 

class FileMenuController { 

    private MenuBar menuBar; 

    public void openFile() { 
     FileChooser fileChooser = new FileChooser(); 
     fileChooser.setTitle("Open"); 
     fileChooser.getExtensionFilters().addAll(
       new FileChooser.ExtensionFilter("*.txt", "*.txt"), 
       new FileChooser.ExtensionFilter("All types", "*.*") 
     ); 
     File file = fileChooser.showOpenDialog(menuBar.getScene().getWindow()); 
    } 

    public void setMenuBar(MenuBar menuBar) { 
     this.menuBar = menuBar; 
    } 

}私は、ファイルメニューのオープンオプションを選択すると

私はこれらの例外ました:

Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException 
Caused by: java.lang.NullPointerException 
    at controllers.menu.FileMenuController.openFile(FileMenuController.java:23) 
    at controllers.menu.MenuController.openFile(MenuController.java:19) 

は、誰も私にこの問題を解決するための方法をアドバイスのいくつかの作品を与えることはできますか?メニューコントローラーを分割する方がいいですか?すべてのコントローラーが1つのことだけに責任がありますか?

+0

は、コンストラクタが呼び出さなっていますか? – matt

+0

'fx:controller =" controllers.menu.FileMenuController "' – matt

+0

などの特定のメニューに適切なタグを追加できますか?1つのfxmlファイルにはコントローラが1つしかないので、残念なことにすべてのメニュー項目にコントローラを追加できません。 – WojciechS

答えて

1

menuBarが設定される前にコンストラクタが呼び出されているため、MenuControllerはInitalizableインターフェイスのinitalizeメソッドを使用する必要があります。 固定MenuController:menuBarを多分MenuControllerへの参照を使用し、設定した後、方法、getMenuBarを持って取得される前に、

package controllers.menu; 

import javafx.fxml.FXML; 
import javafx.fxml.Initializable; 
import javafx.scene.control.MenuBar; 

import java.net.URL; 
import java.util.ResourceBundle; 

public class MenuController implements Initializable{ 

    @FXML 
    private MenuBar menuBar; 

    private FileMenuController fileMenuController; 
    private EditMenuController editMenuController; 
    private SettingsMenuController settingsMenuController; 
    private HelpMenuController helpMenuController; 

    public void openFile(){ 
     fileMenuController.openFile(); 
    } 

    @Override 
    public void initialize(URL location, ResourceBundle resources) { 
     fileMenuController = new FileMenuController(); 
     fileMenuController.setMenuBar(menuBar); 
    } 
} 
関連する問題