Java 我可以使用多个类来控制一个FXML文件吗?

Java 我可以使用多个类来控制一个FXML文件吗?,java,javafx,fxml,Java,Javafx,Fxml,我在一个FXML上的Scene Builder中创建了一个应用程序。我正在用JavaFX制作一个服务器,这样我就可以学习JavaFX并更加熟悉Java的网络库 我在选项卡窗格中有一个服务器终端选项卡和其他选项卡。我想创建扩展到主控制器类的类来处理每个选项卡中的组件 在尝试实现这一点时,我发现如果@FXML注释变量是静态的,FXMLLoader将无法读取内容。如果@FXML注释的事件侦听器方法也是静态的,那么它也不会被读取 如果我尝试任何一种解决方法,在尝试更改文本区域中的文本时,我会遇到Null

我在一个FXML上的Scene Builder中创建了一个应用程序。我正在用JavaFX制作一个服务器,这样我就可以学习JavaFX并更加熟悉Java的网络库

我在选项卡窗格中有一个服务器终端选项卡和其他选项卡。我想创建扩展到主控制器类的类来处理每个选项卡中的组件

在尝试实现这一点时,我发现如果@FXML注释变量是静态的,FXMLLoader将无法读取内容。如果@FXML注释的事件侦听器方法也是静态的,那么它也不会被读取

如果我尝试任何一种解决方法,在尝试更改文本区域中的文本时,我会遇到NullPointerException。我真的不想使用多个FXML文件,但看起来我必须这样做,因为如果我不能使这些文件保持静态,那么它就无法工作

在服务器终端选项卡中有一个文本区域、一个文本字段和一个按钮。 这是我的工作代码:

 package me.Cronin.Keith.JavaServer;

 import java.io.IOException;
 import javafx.application.Application;
 import javafx.fxml.FXML;
 import javafx.fxml.FXMLLoader;
 import javafx.scene.Parent;
 import javafx.scene.Scene;
 import javafx.scene.control.Button;
 import javafx.scene.control.TextArea;
 import javafx.scene.control.TextField;
 import javafx.scene.input.MouseEvent;
 import javafx.stage.Stage;


public class JavaServer extends Application {

@FXML 
public Button btnSendCommand;
@FXML 
public TextField consoleInputField;
@FXML 
public TextArea serverTerminal;

public static FXMLLoader fxmlLoader = new FXMLLoader(JavaServer.class.getResource("JavaServer.fxml"));

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

@Override
public void start(Stage stage) throws IOException
{
    Parent p = fxmlLoader.load();
    Scene scene = new Scene(p);
    stage.setTitle("Java Server v1.0");
    stage.setScene(scene);
    stage.show();
}

@FXML
public void clickSendCommand(MouseEvent event)
{
    serverTerminal.setText("I got clicked..");
}


}
这是另一个我还不知道该怎么办的类:

    package me.Cronin.Keith.JavaServer.Terminal;

    import me.Cronin.Keith.JavaServer.JavaServer;

  public class Terminal extends JavaServer {


  public static void logTerminal(String msg) 
  {

}

}
我能做些什么来改变这一点以支持我想做的事情吗? 我希望能够控制JavaServer.class中的变量(来自FXML的JavaFX组件)以及在此基础上扩展的其他类

我在这里看到了这个问题:

但它没有回答我的问题


看起来我必须把所有的东西都放在主控制器类中,或者有多个Fxml文件。

我可以通过用以下内容替换终端类来实现这一点:

Terminal.java

   package me.Cronin.Keith.JavaServer.Terminal;

   import me.Cronin.Keith.JavaServer.JavaServer;

  public class Terminal extends JavaServer {


      public static void logTerminal(String msg) 
       {
         JavaServer mainController = fxmlLoader.getController();
         mainController.serverTerminal.setText(msg + "\n");
       }
}

所以答案是可以的。


在JavaServer.java中,我只是静态地调用了Terminal.class,然后在其中使用了静态方法logTerminal()。我在Terminal.java中扩展了JavaServer.java,因此可以静态调用控制器的FXMLLoader。

现在还不清楚您要做什么。
应用程序
类不应是控制器。每个FXML文件应该有一个控制器类。如果要在不同选项卡中使用不同的组件,请为每个选项卡定义一个FXML文件,并为每个FXML文件定义一个控制器类。我真的不认为某些控制器类会是其他控制器类的子类。