2017-03-21 13 views
-1

컨트롤러를로드 할 때 약간의 문제가 있으며 선택 상자를 만들고 싶습니다. 새로운 스테이지를 만들고 maincontroller 객체로 장면을로드하려고합니다. choiceBox를 생성하는 동안 JavaFX로드 예외

<?import javafx.scene.text.*?> 
<?import javafx.scene.control.*?> 
<?import java.lang.*?> 
<?import javafx.scene.layout.*?> 
<?import javafx.scene.layout.AnchorPane?> 

도움이

주 패널 주셔서 감사합니다 :

package simplygoals.control; 
import java.net.URL; 
import java.util.ResourceBundle; 
import javafx.beans.value.ChangeListener; 
import javafx.beans.value.ObservableValue; 
import javafx.event.ActionEvent; 
import javafx.fxml.FXML; 
import javafx.fxml.Initializable; 
import javafx.scene.control.Button; 
import javafx.scene.control.ChoiceBox; 
import javafx.scene.control.Label; 
import javafx.scene.control.Tooltip; 
import simplygoals.modelLogicComponents.User; 
import simplygoals.control.MainPanelController; 

public class RemoveUserController extends MainController implements Initializable { 
private MainPanelController mainControl; 
@FXML 
private ChoiceBox<User> UsersChoiceBox; 

@FXML 
private Label MessageLabel; 

@FXML 
private Button RemoveUsersButton; 

@FXML 
void f50303(ActionEvent event) { 

} 
boolean userRemoved=false; 
User removedUser=null; 
    @Override 
    public void initialize(URL location, ResourceBundle resources) { 
     choiceBoxInit(); 
    // observeChoiceBox(); 
    // removeUser(); 
    } 

    public void choiceBoxInit(){ 
     System.out.println(this.mainControl.getModelLogic()); 
    // UsersChoiceBox.setItems(this.mainControl.getModelLogic().getUserList()); 
    } 
    public void observeChoiceBox(){ 
     UsersChoiceBox.getSelectionModel().selectedIndexProperty().addListener(new ChangeListener<Number>(){ 
     public void changed(ObservableValue ov, Number value, Number new_value){ 
        if((new_value.intValue()>=0)&&(new_value.intValue()<=mainControl.getModelLogic().getUserList().size())){ 
         removedUser=mainControl.getModelLogic().getUserList().get(new_value.intValue()); 
        } 
     } 
     }); 
    } 
    public void removeUser(){ 
     RemoveUsersButton.setTooltip(new Tooltip("Select user")); 
     RemoveUsersButton.setOnAction(x->{ 

      String message = mainControl.getModelLogic().removeUserFromLogic(removedUser); 
      MessageLabel.setText("");    
      UsersChoiceBox.getItems().clear(); 
      UsersChoiceBox.setItems(mainControl.getModelLogic().getUserList()); 
      mainControl.updateComboBox(); 
     }); 
    } 

    public void setMainControl(MainPanelController mainPanel){ 
     mainControl=mainPanel; 
    } 

}

다음

내가 내 xml 파일에서 가져올 것입니다 :

javafx.fxml.LoadException: 
/C:/Users/Kutti/workspace/SimplyGoals/bin/simplygoals/view/RemoveUser.fxml 

at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2601) 
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2579) 
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441) 
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2409) 
at simplygoals.control.MainPanelController.lambda$2(MainPanelController.java:106) 
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86) 
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238) 
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191) 
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74) 
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49) 
at javafx.event.Event.fireEvent(Event.java:198) 
at javafx.scene.Node.fireEvent(Node.java:8413) 
at javafx.scene.control.Button.fire(Button.java:185) 
at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:182) 
at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:96) 
at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:89) 
at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218) 
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80) 
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238) 
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191) 
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74) 
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54) 
at javafx.event.Event.fireEvent(Event.java:198) 
at javafx.scene.Scene$MouseHandler.process(Scene.java:3757) 
at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485) 
at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762) 
at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494) 
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:381) 
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:295) 
at java.security.AccessController.doPrivileged(Native Method) 
at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$354(GlassViewEventHandler.java:417) 
at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389) 
at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:416) 
at com.sun.glass.ui.View.handleMouseEvent(View.java:555) 
at com.sun.glass.ui.View.notifyMouse(View.java:937) 
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) 
at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191) 
at java.lang.Thread.run(Unknown Source) 
Caused by: java.lang.NullPointerException 
at simplygoals.control.RemoveUserController.choiceBoxInit(RemoveUserController.java:45) 
at simplygoals.control.RemoveUserController.initialize(RemoveUserController.java:39) 
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2548) 
... 50 more 

컨트롤러가 컨트롤러 클래스 :

public class MainPanelController extends MainController implements Initializable { 

@FXML 
private TopPanelController topPanelController; 
public TopPanelController getTopPanelController() { 
    return topPanelController; 
} 

@FXML 
private MenuPanelController menuPanelController; 

@FXML 
private LeftPanelTimeModeController leftPanelTimeModeController; 

@FXML 
private CenterPanelTableController centerPanelTableController; 

@Override 
public void initialize(URL location, ResourceBundle resources) { 

    getModelLogic().createDB();//if there is no database create it, otherwise not 
    getModelLogic().updateUsers();//copy users from database to ModelLogic 
    updateComboBox(); 
    showAddUserPanel(); 
    showRemoveUserPanel(); 
    setUser(); 
    modelLogicToFile(); 

} 
public void updateComboBox(){ 
    ComboBox<String> comboBox = getTopPanelController().getUsersComboBox(); 

    comboBox.setOnMouseClicked(event->{ 
     comboBox.setItems(getModelLogic().getUsersObservableList());   
    }); 
} 
public void setUser(){ 
    ComboBox<String> comboBox = getTopPanelController().getUsersComboBox(); 
    comboBox.valueProperty().addListener(new ChangeListener<String>() { 
     @Override 
     public void changed(ObservableValue ov, String v1, String v2) {     
      if((v2!=null)){getModelLogic().setCurrentUser(v2);} 


     }  
    }); 
} 
public void showAddUserPanel(){ 
    Button button = getTopPanelController().getAddUserButton(); 
    button.setOnAction(event -> { 
         try { 
          FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/simplygoals/view/AddUser.fxml")); 
          Parent root1 = (Parent) fxmlLoader.load(); 
          Stage stage = new Stage(); 
          stage.setResizable(false); 
          stage.setTitle("Add User"); 
          stage.setScene(new Scene(root1)); 
          AddUserController addUserController = fxmlLoader.getController(); 
          addUserController.setMainControl(this); 
          stage.show(); 
         } catch(Exception e) { 
          e.printStackTrace(); 
         } 
           }); 
} 
public void showRemoveUserPanel(){ 
    Button button = getTopPanelController().getRemoveUserButton(); 
    button.setOnAction(event -> { 
         try { 
          FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/simplygoals/view/RemoveUser.fxml")); 
          Parent root2 = (Parent) fxmlLoader.load(); 
          Stage stage = new Stage(); 
          stage.setResizable(false); 
          stage.setTitle("Remove User"); 
          stage.setScene(new Scene(root2)); 
          RemoveUserController removeUserController = fxmlLoader.getController(); 
          removeUserController.setMainControl(this); 
          stage.show(); 
         } catch(Exception e) { 
          e.printStackTrace(); 
         } 
           }); 

} 

}

+0

'mainControl'가 null입니다. –

+0

예. 나는 이것에 관해 안다. 하지만 observablelist를 choicebox에 설정하려고하지는 않지만 fe. mainControl 일부 단추에서 mainControl 캐스트 null이 아닙니다. observablelist에서 일부 개체를 선택 상자에 저장하려면 몇 가지 문제가 있습니다. FxmlLodader는 mainControl을로드하지 않습니다. 마지막으로 자바를 업데이트하고 패키지의 이름을 바꿨습니다. – Kutti

답변

1

이는 널 포인터 예외의 표준 디버깅에 지나지 않는다.

stack trace에서 분명히 볼 수 있듯이 RemoveUserController.choiceBoxInit()을 호출하면 이 null입니다. 이 메서드는 RemoveUserController.initialize()에서 호출됩니다.

FXMLLoader이 FXML 파일을로드 할 때 initialize() 메서드가 호출됩니다. 즉, FXMLLoader.load(...) 메서드에서 호출됩니다.

FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/simplygoals/view/RemoveUser.fxml")); 

// this line causes RemoveUserController.initialize() to be called: 
Parent root2 = (Parent) fxmlLoader.load(); 

Stage stage = new Stage(); 
stage.setResizable(false); 
stage.setTitle("Remove User"); 
stage.setScene(new Scene(root2)); 
RemoveUserController removeUserController = fxmlLoader.getController(); 

// mainControl is not initialized in removeUserController until you do this: 
removeUserController.setMainControl(this); 

따라서이라고 mainControlsetMainControl 때까지 액세스 할 수 없습니다 당신이 (명백하게) 당신이 load() 후이 완료 수행 setMainController(...) 메소드를 호출 할 때까지

당신은 mainControl에 값을 할당하지 않습니다. 그냥 initialize()setMainControl()까지 choiceBoxInit()로 통화를 이동 :

@Override 
public void initialize(URL location, ResourceBundle resources) { 
// choiceBoxInit(); 
// observeChoiceBox(); 
// removeUser(); 
} 

public void choiceBoxInit(){ 
    System.out.println(this.mainControl.getModelLogic()); 
// UsersChoiceBox.setItems(this.mainControl.getModelLogic().getUserList()); 
} 

// ... 

public void setMainControl(MainPanelController mainPanel){ 
    mainControl=mainPanel; 
    choiceBoxInit(); 
} 
+0

이것은 매우 간단하지만이 방법을 fe라고 부를 수는 없다. choiceboxInit()는 initialize()와 다른 메서드입니다. 응. 하지만 지금은 상상할 수 있습니다. 고맙습니다. – Kutti