JavaFXの@FXMLによるフィールドはstaticにすることはできないと思います。FXMLにより実体化されたビューのインスタンス(それはNodeインスタンスの階層となります)はコントローラーのインスタンスで制御されるため、インスタンスの属性でないもの(staticフィールドとか)とビューを結びつけることは適切でないと思います。
(FXMLLoaderはfx:id属性が付いているノードをコントローラーインスタンスの@FXML付きのインスタンスフィールドから探してノードの参照を自動設定してくれますが、そのようなフィールドがなかったりstaticになっていても何もエラーを発しないようです。エラーにしない目的があるのかも知れませんが、なんだか不親切な気もします・・・)
ところで最初にJavaの習慣を確認しておきましょう。インスタンスフィールドやメソッド名を大文字で始まる名前にするのは慎みましょう。第三者がみると非常に違和感を覚えます。話も通じにくくなるので以降ではフィールド名を小文字で始めます。
さて、ControllerクラスのnameFieldはstaticにできないのですが、それはつまりControllerクラスのインスタンスのフィールドになることを意味します。
またModelクラスにはgetNameというメソッドがありますが、これは「Modelクラスのインスタンス」に対して呼び出すべきメソッドですね。
getNameからnameFieldをアクセスするには「ModelクラスのインスタンスがControllerクラスのインスタンスを知っていればよい」ということになるのですが・・・
このコードは一部でしかないため実際のところどうすべきかは明確には答えられません。しかし個人的な意見としてはModel#setNameの考え方を変えた方がよい気がします。
名前からしてModelは何かのデータモデルでしょうから、それはコントローラーのインスタンスに依存した実装にすべきではないと思います。例えばsetNameの実装は以下のようなものであるべきだと思います。
java
1public class Model{
2 String name;
3
4 public void setName(String value) {
5 name = value;
6 }
7}
どうやってGUI上のTextFieldの内容をこのモデルに設定するかと言えば、このModel自身がそれを意識するのではなくsetNameを呼び出す側が意識すべきだと思います。例えばそれはControllerインスタンスがやるべきでしょう。またそうするにはControllerインスタンスもまたModelのインスタンスを知らねばなりません。
ControllerインスタンスがどのようにしてModelインスタンスを知るように作るかは一概に言えませんが、もしこの画面が新たなモデルを生成するためのものなら、Controllerのインスタンスが生成されたタイミングで新たにModelのインスタンスも生成しControllerインスタンスがそれを保持するのも一つの方法と思います。
java
1public class Controller {
2 @FXML private TextField nameField;
3 @FXML private Button okBtn;
4
5 Model model = new Model();
6
7 public void onOkBtnClicked(ActionEvent e){
8 model.setName(nameField.getText());
9 }
10}
ところで、質問者さんはクラスとインスタンスの理解が漠然としてはいないでしょうか?
例えば色々な解説で
- XXXのMMMメソッドを呼び出す
- XXXのFFFフィールドをアクセスする
なんて書き方になっていたりしますが、それは厳密に言えば
- XXXクラスのインスタンスに対してMMMメソッドを呼び出す
- XXXクラスのインスタンスのFFFフィールドをアクセスする
を意味するケースが多いと思います。一々「XXXクラスのインスタンスの~」というのが長ったらしく読みにくくなるため「インスタンスのことを言っているのだけど、そこはこの文脈を読者が解釈してくれるだろう」みたいな感覚で「XXXの~」と省略してしまう解説が実に多いです。自分で「クラス」のことを言っているのか「インスタンス」のことを言っているのかを文脈から正確に把握しないと混乱してしまうのでその点も注意した方がよいかも知れません。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。