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

时间:2017-11-04 20:34:36

标签: java javafx fxml

我在一个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文件。

1 个答案:

答案 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。