如何通过单击按钮在同一窗口上动态加载相同的fxml文件?

时间:2016-03-17 10:18:57

标签: javafx tabs fxml

我正在使用javafx制作浏览器,但我无法在其中添加新的标签功能。我已经在google上搜索了很多,也在stackoverflow上搜索但没有任何效果。我想通过点击再次加载主fxml文件新标签按钮。

以下是主页

第一page.fxml

<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.*?>
<?import javafx.scene.input.*?>
<!-- all imports -->

<AnchorPane xmlns="http://javafx.com/javafx/8.0.40" xmlns:fx="http://javafx.com/fxml/1" fx:controller="tabcheck.Home_controller">
   <children>
      <TabPane fx:id="tabpane" prefHeight="629.0" prefWidth="1024.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
         <tabs>
            <Tab fx:id="tab1" text="Tab1">
               <content>
                  <AnchorPane>
                     <children>
                        <BorderPane fx:id="mainLayout" prefHeight="600.0" prefWidth="1024.0">
                           <top>
                              <HBox fx:id="Hbox" prefHeight="54.0" prefWidth="1024.0" spacing="15.0" BorderPane.alignment="CENTER">
                                 <children>
                                  <Button fx:id="go_btn" mnemonicParsing="false" onAction="#G" prefHeight="25.0" prefWidth="30.0"/>
                                  <Button fx:id="smartnote_btn" layoutX="419.0" layoutY="10.0" mnemonicParsing="false" onAction="#OpenNotes" prefHeight="25.0" prefWidth="30.0"/>
                                  <Button fx:id="newtab_btn" layoutX="523.0" layoutY="10.0" mnemonicParsing="false" onAction="#addTab" prefHeight="25.0" prefWidth="30.0"/>
                                 <MenuButton fx:id="setting_btn" mnemonicParsing="false" prefHeight="25.0" prefWidth="50.0">
                                   <items>
                                   <MenuItem mnemonicParsing="false" text="Bookmark" />
                                   </items>

                                                                                                                       </MenuButton>
                                 </children>
                                </HBox>
                           </top>
                           <center>
                              <WebView fx:id="webView" prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER" />

                                                                    </center>
                        </BorderPane>
                     </children>
                  </AnchorPane>
               </content>
            </Tab>
         </tabs>
      </TabPane>
   </children>
</AnchorPane>

下面是Main.java文件

package tabcheck;
import javafx.application.Application;
 //all imports..
public class Main extends Application{

public static void main(String[] args){
  launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception {
try{
      Parent root = FXMLLoader.load(getClass().getResource("/tabcheck/First    page.fxml"));
      Scene scene = new Scene(root);
      scene.getStylesheets().add("tabcheck/application.css");
      primaryStage.setScene(scene);
     primaryStage.show();
  } 
   catch(Exception e){ e.printStackTrace();}
  }
}

以下是First-page.fxml的控制器

Home_controller.java

 package tabcheck;
 import java.io.IOException;
 import java.net.URL;
 //All imports...

 public class Home_controller implements Initializable{
    @FXML private Button forward_btn;
    @FXML private Button refresh_btn;
    @FXML private Button go_btn;
    @FXML private TextField addressField;
    @FXML private WebView webView;
    @FXML private TabPane tabpane ;
    @FXML private BorderPane mainLayout;
     private Main main;
     private WebEngine webEngine;

 @Override
  public void initialize(URL url, ResourceBundle rb){
      webEngine = webView.getEngine();
      webEngine.load(&amp;quot;http://www.google.com&amp;quot;);
      webEngine.locationProperty().addListener(new ChangeListener&amp;lt;String&amp;gt;()        {
      @Override
      public void changed(ObservableValue&amp;lt;? extends String&amp;gt; observable, String oldValue, String newValue) {
          addressField.setText(newValue);
      }
     });
      addressField.setText(&amp;quot;http://www.google.com&amp;quot;);
    }

public String fload(ActionEvent ae )
{// code....
 }
 @FXML
 private void addTab() throws IOException{
     Tab tab = new Tab(&amp;quot;New Tab&amp;quot;);
     tabpane.getTabs().add(tab);
    // tabpane.getSelectionModel().clearSelection();
     FXMLLoader loader = new FXMLLoader();
     loader.setLocation(Main.class.getResource(&amp;quot;/tabcheck/Tab-First-page.fxml&amp;quot;));
     AnchorPane tabAnchor = loader.load();
     tab.setContent(tabAnchor);
  }

在Controller类中 Tab-First-page.fxml 是first-page.fxml的副本,而Tab-first-page.fxml中的更改是它不包含Tabpane,否则它是相同的

我可以从First-page.fxml加载多个选项卡,但无法从Tab-first-page.fxml打开新选项卡,也就是说,从主页面可以动态打开多个选项卡但是从那些打开的选项卡我是无法打开标签页。 以下是我得到的错误......

Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
    at javafx.fxml.FXMLLoader$MethodHandler.invoke(Unknown Source)
    at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(Unknown Source)
    //whole stack of error...
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at sun.reflect.misc.MethodUtil.invoke(Unknown Source)
    ... 53 more
**Caused by: java.lang.NullPointerException
    at tabcheck.Home_controller.addTab(Home_controller.java:200)
    ... 62 more**

Home_controller.java:200在addTab()方法中是 tabpane.getTabs()。add(tab); 。 我已尝试过所有可能的解决方案,但无法从子打开标签再次加载主页内容,请任何人可以帮忙吗?

0 个答案:

没有答案