全部はみてないですが、
String me = msgbox.getText();
でNPEが起こっていて原因はmsgboxがnullだからと思います。メンバー定義をみると
@FXML
static TextField msgbox;
となっています。(これ・・・FXMLLoader.loadでエラーにならないんですですね・・・)なぜstaticにしたかは想像できますが根本的な対策になっていないと思います。
現在の動きでは・・・
- アプリケーション開始
ChatC(Applicationの派生)のインスタンスがJavaFxランタイムにより自動的に作られてstartが呼ばれます。
- FXMLのロード
startでFXMLoader#loadしてますがChatCがコントローラークラスとしてFXMLファイルに定義されているためloadの中でコントローラークラスとしてのChatCの別のインスタンスが生成されてしまいます。
同一プログラムの中にApplicationインスタンス(ChatCなど)が複数できてしまい、しかもアプリケーションとしての役割とコントローラーとしての役割をごちゃまぜに実装しているためプログラムが破たんしている気がします。
対処:
いくつか方法はあると思います。アプリケーションクラスとコントローラークラスを兼任するクラスもできるとは思いますが個人的にやったことがないので、別クラスにする方法をお勧めしてみます。
FXMLを使用したカスタム・コントロールの作成
ここのページの図4-1,図4-3周辺を参照してVBoxの派生クラスをコントローラーとしてそのまま利用してはいかがでしょうか。下記コードの(1),(2)がポイントです。こうすることでFXMLLoaderがコントローラークラスを生成するのではなくsetController,setRootであらかじめ指定したインスタンスがコントローラーとなります。
FXML(chatc.fxml)
<fx:root type="javafx.scene.layout.VBox" xmlns:fx="http://javafx.com/fxml">
...
<TextField fx:id="msgbox" ... />
...
コントローラークラス
java
1class CustomController extends VBox {
2 @FXML
3 private TextField msgbox;
4 ...
5
6 CustomController() {
7 FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("chatc.fxml"));
8 fxmlLoader.setRoot(this); //(1)
9 fxmlLoader.setController(this); //(2)
10 fxmlLoader.load();
11 }
12}
アプリケーションクラス
java
1public class ChatC extends Application {
2 @Override
3 public void start(Stage stage) {
4 CustomController controller = new CustomController();
5 stage.setScene(new Scene(controller));
6 ...
7 stage.show();
8 }
9}
2017/02/12 05:27