Java 我可以使用多个类来控制一个FXML文件吗?
我在一个FXML上的Scene Builder中创建了一个应用程序。我正在用JavaFX制作一个服务器,这样我就可以学习JavaFX并更加熟悉Java的网络库 我在选项卡窗格中有一个服务器终端选项卡和其他选项卡。我想创建扩展到主控制器类的类来处理每个选项卡中的组件 在尝试实现这一点时,我发现如果@FXML注释变量是静态的,FXMLLoader将无法读取内容。如果@FXML注释的事件侦听器方法也是静态的,那么它也不会被读取 如果我尝试任何一种解决方法,在尝试更改文本区域中的文本时,我会遇到NullPointerException。我真的不想使用多个FXML文件,但看起来我必须这样做,因为如果我不能使这些文件保持静态,那么它就无法工作 在服务器终端选项卡中有一个文本区域、一个文本字段和一个按钮。 这是我的工作代码:Java 我可以使用多个类来控制一个FXML文件吗?,java,javafx,fxml,Java,Javafx,Fxml,我在一个FXML上的Scene Builder中创建了一个应用程序。我正在用JavaFX制作一个服务器,这样我就可以学习JavaFX并更加熟悉Java的网络库 我在选项卡窗格中有一个服务器终端选项卡和其他选项卡。我想创建扩展到主控制器类的类来处理每个选项卡中的组件 在尝试实现这一点时,我发现如果@FXML注释变量是静态的,FXMLLoader将无法读取内容。如果@FXML注释的事件侦听器方法也是静态的,那么它也不会被读取 如果我尝试任何一种解决方法,在尝试更改文本区域中的文本时,我会遇到Null
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文件定义一个控制器类。我真的不认为某些控制器类会是其他控制器类的子类。