【问题标题】:How to call javafx from a normal java class如何从普通的 java 类调用 javafx
【发布时间】:2018-08-13 12:33:57
【问题描述】:

我想从普通类调用/打开 gui/fxml 文件,我真的很难找到一种方法来做到这一点,我试图实例化控制器类但我没有得到启动功能,甚至有可能做我想做的事吗?

普通班

    public class ReadXMLFile {

  public static void main(String argv[]) {

    }


}

fxml 文件

    <?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.TableColumn?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.layout.AnchorPane?>


<AnchorPane id="AnchorPane" prefHeight="442.0" prefWidth="449.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8.0.141" fx:controller="gis_map.CitizenScheduledController">
   <children>
      <TableView layoutX="1.0" layoutY="-1.0" prefHeight="384.0" prefWidth="447.0">
        <columns>
          <TableColumn prefWidth="75.0" text="CitizenId" />
          <TableColumn prefWidth="75.0" text="Name" />
            <TableColumn prefWidth="75.0" text="Address" />
            <TableColumn prefWidth="75.0" text="Arrival" />
            <TableColumn prefWidth="75.0" text="Departure" />
            <TableColumn prefWidth="75.0" text="Actions" />
        </columns>
      </TableView>
      <Button layoutX="373.0" layoutY="396.0" mnemonicParsing="false" text="Approve" />
   </children>
</AnchorPane>

控制器类

    package gis_map;

import java.net.URL;
import java.util.ResourceBundle;
import javafx.fxml.Initializable;


public class CitizenScheduledController implements Initializable {


    @Override
    public void initialize(URL url, ResourceBundle rb) {
        // TODO
    }    

}

【问题讨论】:

  • 如果你想在某些情况下打开 gui 或者让程序成为你可以尝试从应用程序类拆分包含启动调用的主函数的程序,这样你就可以创建应用程序上课并根据需要启动它

标签: java user-interface javafx fxml


【解决方案1】:

有可能做我想做的事吗?

不(至少,不容易,或者以某种有意义的方式)。

JavaFX 应用程序的生命周期由Application 类的实例控制。此外,您需要启动 JavaFX 工具包并设置 FX 应用程序线程运行。静态 Application.launch(...) 方法可以完成此操作,并创建所需的 Application 类实例并在其上调用适当的生命周期方法。

所以,只需遵循标准模式,将您的ReadXMLFile 类变成Application 的子类,使main(...) 方法只需调用launch(),并定义start() 方法来加载FXML 等.

【讨论】:

    【解决方案2】:

    为了完整起见:

    从 JavaFX 9 开始,可以在不依赖 Application.launch 的情况下启动应用程序。为此,您可以使用Platform.startup。请注意,您只能在应用程序中使用一次Platform.startup 和/或Application.launch

    public static void main(String[] args) {
        Platform.startup(() -> {
            // display empty scene after startup
            Scene scene = new Scene(new Pane());
            Stage stage = new Stage();
            stage.setScene(scene);
            stage.show();
        });
    }
    

    通常最好使用正常的应用程序生命周期并使用扩展Application 的类作为入口点,并使用init/start 方法进行您通常通过main 方法进行的任何初始化。

    【讨论】:

      猜你喜欢
      • 2015-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-18
      • 1970-01-01
      相关资源
      最近更新 更多