2015-06-26 2 views
0

Как добавить/удалить вкладку из TabPane в JavaFX?Как добавить/удалить вкладку из TabPane в JavaFX?

Я пытаюсь использовать TabPane внутри панели в JavaFX, чтобы добавлять и удалять вкладки из TabPane. Я использую на основе макет FXML, который выглядит следующим образом:

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

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


<Pane id="pane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="controller.Controller"> 
<children> 
    <TabPane id="tabPane" prefHeight="328.0" prefWidth="600.0" tabClosingPolicy="ALL_TABS"> 
    <tabs> 
     <Tab text="Tab1"> 
     <content> 
      <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="320.0" prefWidth="600.0" /> 
     </content> 
     </Tab> 
     <Tab text="Tab2"> 
     <content> 
      <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0" /> 
     </content> 
     </Tab> 
    </tabs> 
    </TabPane> 
    <Button id="tabButton" layoutX="274.0" layoutY="361.0" mnemonicParsing="false" onAction="#handleTabButton" text="Button" /> 
</children> 
</Pane> 

Я имею MainApp в Lauch моего приложения и контроллер для обработки событий. Мой MainApp выглядит следующим образом:

package src; 

import controller.Controller; 
import javafx.application.Application; 
import javafx.fxml.FXMLLoader; 
import javafx.scene.Parent; 
import javafx.scene.Scene; 
import javafx.stage.Stage; 

public class MainApp extends Application{ 

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

@Override 
public void start(Stage primaryStage) throws Exception { 
    FXMLLoader loader = new FXMLLoader(getClass().getResource("LMainApp.fxml")); 
    Parent root = loader.load(); 

    Controller controller = loader.getController(); 
    controller.setStage(primaryStage); 

    primaryStage.setTitle("TestTabs"); 

    primaryStage.setScene(new Scene(root)); 
    primaryStage.show(); 
} 

} 

и мой контроллер выглядит следующим образом:

package controller; 

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

import javafx.event.ActionEvent; 
import javafx.fxml.FXML; 
import javafx.fxml.Initializable; 
import javafx.scene.control.SingleSelectionModel; 
import javafx.scene.control.Tab; 
import javafx.scene.control.TabPane; 
import javafx.stage.Stage; 

public class Controller implements Initializable{ 

Stage stage; 

@FXML 
private TabPane tabPane; 

private Tab tab = new Tab(); 
private SingleSelectionModel<Tab> selectionModel; 

@Override 
public void initialize(URL location, ResourceBundle resources) { 
    selectionModel = tabPane.getSelectionModel(); 
} 

public void setStage(Stage stage){ 
    this.stage = stage; 
} 

@FXML 
private void handleTabButton(ActionEvent event){ 
    tab.setText("New Tab"); 
    tab.setId("newTab"); 
    tab.setClosable(true); 
    tabPane.getTabs().add(tab); 
    selectionModel.selectLast(); 
} 

} 

Теперь, когда я запустить приложение, я получаю NullPointerException в selectionModel = tabPane.getSelectionModel(); в моем контроллере. Кажется, tabPane имеет значение null.

StackTrace:

Exception in Application start method 
java.lang.reflect.InvocationTargetException 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(Unknown Source) 
    at com.sun.javafx.application.LauncherImpl.launchApplication(Unknown Source) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at sun.launcher.LauncherHelper$FXHelper.main(Unknown Source) 
Caused by: java.lang.RuntimeException: Exception in Application start method 
    at com.sun.javafx.application.LauncherImpl.launchApplication1(Unknown Source) 
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$152(Unknown Source) 
    at com.sun.javafx.application.LauncherImpl$$Lambda$50/1645995473.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 
Caused by: javafx.fxml.LoadException: 
/E:/EclipseWorkspace/TestTabJFX/bin/src/LMainApp.fxml 

    at javafx.fxml.FXMLLoader.constructLoadException(Unknown Source) 
    at javafx.fxml.FXMLLoader.loadImpl(Unknown Source) 
    at javafx.fxml.FXMLLoader.loadImpl(Unknown Source) 
    at javafx.fxml.FXMLLoader.load(Unknown Source) 
    at src.MainApp.start(MainApp.java:19) 
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$159(Unknown Source) 
    at com.sun.javafx.application.LauncherImpl$$Lambda$53/434272560.run(Unknown Source) 
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$172(Unknown Source) 
    at com.sun.javafx.application.PlatformImpl$$Lambda$46/186276003.run(Unknown Source) 
    at com.sun.javafx.application.PlatformImpl.lambda$null$170(Unknown Source) 
    at com.sun.javafx.application.PlatformImpl$$Lambda$48/463228645.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$171(Unknown Source) 
    at com.sun.javafx.application.PlatformImpl$$Lambda$47/237061348.run(Unknown Source) 
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(Unknown Source) 
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) 
    at com.sun.glass.ui.win.WinApplication.lambda$null$145(Unknown Source) 
    at com.sun.glass.ui.win.WinApplication$$Lambda$36/2117255219.run(Unknown Source) 
    ... 1 more 
Caused by: java.lang.NullPointerException 
    at controller.Controller.initialize(Controller.java:26) 
    ... 18 more 
Exception running application src.MainApp 

Может кто-нибудь предложить, пожалуйста, как решить эту проблему? Более того, если кто-то может мне помочь - как использовать/использовать элементы, присутствующие в файле FXML. Спасибо заранее.

+0

Вы можете добавить StackTrace из исключения в этом вопросе? – ItachiUchiha

+0

Привет @ItachiUchiha, я добавил stacktrace. –

ответ

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