我在一个FXML上在Scene Builder中创建了一个应用程序。我正在使用JavaFX制作服务器,这样我就可以学习JavaFX并更熟悉Java的网络库。
我有一个服务器终端标签和TabPane中的其他标签。我想创建扩展在主控制器类上的类来处理每个选项卡中的组件。
在尝试实现这一点时,我发现如果@FXML带注释的变量是静态的,FXMLLoader将无法读取内容。如果它是静态的,则不会读取@FXML带注释的事件侦听器方法。
如果我尝试任何类型的解决方法,我在尝试更改TextArea中的文本时会得到nullpointerexceptions。我真的不想使用多个FXML文件,但它看起来像我必须要因为如果我不能使这些静态那么它就行不通。
在“服务器终端”选项卡中,有一个TextArea,一个TextField和一个Button。 这是我的工作代码:
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组件)以及扩展它的其他类。
我在这里看到了这个问题: Multiple controller for one FXML file
但它没有回答我的问题。
看起来好像我必须将所有内容放在主控制器类中或者有多个Fxml文件。
答案 0 :(得分:-1)
我能够通过用以下代码替换我的终端类来完成这项工作:
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。