2016-10-30 58 views
1

我有下面的代碼包含一個類和一個嵌套的JavaFX Controller。我初始化JavaFX控制器類,我得到它的一個實例,你可以看到。公共類中嵌套的JavaFX控制器

SpeechWindow類:

import java.io.IOException; 
import java.net.URL; 
import java.util.ResourceBundle; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

import application.Main; 
import javafx.application.Platform; 
import javafx.fxml.FXML; 
import javafx.fxml.FXMLLoader; 
import javafx.fxml.Initializable; 
import javafx.scene.Scene; 
import javafx.scene.control.TextArea; 
import javafx.scene.layout.BorderPane; 
import javafx.stage.Stage; 

/** 
* SpeechWindow 
* 
*/ 
public class SpeechWindow extends Stage { 

    private Container container = new Container(); 

    /** 
    * Constructor 
    */ 
    public SpeechWindow() { 

     setTitle("SpeechResults"); 
     setScene(new Scene(container)); 
    } 

    /** 
    * @param text 
    */ 
    public void appendText(String text) { 
     container.appendText(text); 
    } 

    /** 
    * 
    */ 
    public void clear() { 
     container.clear(); 
    } 

    public class Container extends BorderPane implements Initializable { 

     @FXML 
     private TextArea textArea; 

     public Container() { 
      // FXMLLOADER 
      FXMLLoader loader = new FXMLLoader(getClass().getResource("SpeechWindow.fxml")); 
      try { 
       loader.load(); 
      } catch (IOException ex) { 
       ex.printStackTrace(); 
      } 
     } 

     @Override 
     public void initialize(URL location , ResourceBundle resources) { 
      System.out.println("Container has been initialized.."); 
     } 

     public void appendText(String text) { 
      Platform.runLater(() -> textArea.appendText(text + "\n")); 
     } 

     public void clear() { 
      Platform.runLater(textArea::clear); 
     } 

    } 

} 

這是FXML代碼

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

<?import javafx.scene.control.TextArea?> 
<?import javafx.scene.layout.BorderPane?> 


<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.60" xmlns:fx="http://javafx.com/fxml/1"> 
    <center> 
     <TextArea fx:id="textArea" editable="false" prefHeight="200.0" prefWidth="200.0" promptText="...no response" wrapText="true" BorderPane.alignment="CENTER" /> 
    </center> 
</BorderPane> 

嘗試從主JavaFX應用程序類創建的SpeechWindow實例調用它並調用appendText(); method.A空指針出來爲什麼?

我們的目標是:

然後我想創建一個實例外類,並使用它。


錯在:

如果我創建SpeechWindow類的實例,並調用該方法appendText();我得到空指針異常...爲什麼出現這種情況,我看到的一切都做fine.What是我的錯?

回答

2

您從不將控制器實例連接到fxml。

使用setControllerFXMLLoader設置控制器類。

此外,您需要以某種方式將fxml的加載結果添加到場景中。可能你應該用fx:root元素替換fxml的根元素。

BTW:這似乎是一個壞主意,只是趕上負載的例外,如果實例不能使用,如果這樣的情況發生的異常...

public Container() { 
    // FXMLLOADER 
    FXMLLoader loader = new FXMLLoader(getClass().getResource("SpeechWindow.fxml")); 

    // set controller & root 
    loader.setController(this); 
    loader.setRoot(this); 
    try { 
     loader.load(); 
    } catch (IOException ex) { 
     // throw as cause of RuntimeException 
     throw new IllegalStateException(ex); 
    } 
} 
<?xml version="1.0" encoding="UTF-8"?> 

<?import javafx.scene.control.TextArea?> 
<?import javafx.scene.layout.BorderPane?> 

<fx:root type="javafx.scene.layout.BorderPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.60" xmlns:fx="http://javafx.com/fxml/1"> 
    <center> 
     <TextArea fx:id="textArea" editable="false" prefHeight="200.0" prefWidth="200.0" promptText="...no response" wrapText="true" BorderPane.alignment="CENTER" /> 
    </center> 
</fx:root> 
+0

哦,daaaamn我錯過了,謝謝Fabian!我會檢查它是否有效,然後將其標記爲答案... – GOXR3PLUS

1

在調用其方法之前,必須使用FXMLLoader.getController()方法來獲取您的Container類。

嘗試從SpeechWindow類,而不是Container的構造函數中調用

FXMLLoader loader = new FXMLLoader(getClass().getResource(".../SpeechWindow.fxml")); 

。然後通過檢索Container

Container container = loader.getController(); 
+0

謝謝你的努力Cryptor但在這裏我想用'fx:root',我錯過了你可以在Fabian的答案中看到的東西。 – GOXR3PLUS

+0

無論如何,這個答案不應該工作,因爲沒有'FXMLLoader'創建的控制器,因爲在fxml中沒有指定'fx:controller'屬性... – fabian