1

我正在尝试用 JavaFX 替换 JSP、HTML 和 JavaScript,所以我将 FXML 文件和业务逻辑保留在网络服务器中。我可以从服务器加载 FXML 并通过简单的 JavaFX(java) 代码在客户端显示它们,但我无法动态加载事件处理程序(控制器)。我想让客户端应用程序成为轻量级应用程序。

有人可以提出更好的方法吗?

编辑:我们必须在 fxml 文件中指定事件处理程序类名。事件处理程序对象在 FXMLLoader 加载 fxml 时实例化。我将 fxml 和事件处理程序类保存在 tomcat 服务器中。我创建了一个使用 URLConnection 从服务器加载 fxml 的应用程序。现在加载了 fxml,但我无法处理 fxml 文件中定义的控件的事件。因为在通过 FXMLLoader 加载 fxml 时,事件处理程序类也由 FXMLLoader 实例化。在我的客户端应用程序事件处理程序类中不可用。但事件处理程序在 tomcat 服务器中可用。有没有办法从服务器加载类文件并在客户端动态实例化类文件(事件处理程序)。

4

2 回答 2

4

使用诸如 JavaScript 之类的脚本语言是从服务器加载带有一些相关控制逻辑的 fxml 页面的一种方法,这样就不需要在客户端机器上进行编译——它与已建立的 html+JavaScript 模型非常相似。

您可以试用WebFX作为这种方法的示例。

节拍器.fxml

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

<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.shape.*?>

<AnchorPane id="AnchorPane" prefHeight="370.0" prefWidth="320.0" xmlns:fx="http://javafx.com/fxml">
  <children>
    <HBox id="HBox" alignment="CENTER" layoutX="36.0" layoutY="328.0" spacing="5.0">
      <children>
        <Button fx:id="startButton" mnemonicParsing="false" onAction="handleStartButtonAction(event);" text="%start" />
        <Button fx:id="pauseButton" mnemonicParsing="false" onAction="handlePauseButtonAction(event);" text="%pause" />
        <Button fx:id="resumeButton" mnemonicParsing="false" onAction="handleResumeButtonAction(event);" text="%resume" />
        <Button fx:id="stopButton" mnemonicParsing="false" onAction="handleStopButtonAction(event);" text="%stop" />
      </children>
    </HBox>
    <Circle fx:id="circle" fill="RED" layoutX="64.0" layoutY="58.0" radius="7.0" stroke="BLACK" strokeType="INSIDE" strokeWidth="0.0" />
  </children>

  <fx:script source="metronome.js" />
</AnchorPane>

节拍器.js

var webfx = {title: "Metronome WebFX Sample"};

var java = Packages.java;
var javafx = Packages.javafx;

var URL = java.net.URL;
var ResourceBundle = java.util.ResourceBundle;

var Animation = javafx.animation.Animation;
var Interpolator = javafx.animation.Interpolator;
var Timeline = javafx.animation.Timeline;
var TranslateTransitionBuilder = javafx.animation.TranslateTransitionBuilder;
var Duration = javafx.util.Duration;

var anim = TranslateTransitionBuilder.create()
        .duration(new Duration(1000.0))
        .node(circle)
        .fromX(0)
        .toX(200)
        .interpolator(Interpolator.LINEAR)
        .autoReverse(true)
        .cycleCount(Timeline.INDEFINITE)
        .build();

function handleStartButtonAction()  { anim.playFromStart(); }    
function handlePauseButtonAction()  { anim.pause(); }    
function handleResumeButtonAction() { anim.play();  }
function handleStopButtonAction()   { anim.stop();  }    
startButton.disableProperty().bind(anim.statusProperty().isNotEqualTo(Animation.Status.STOPPED));
pauseButton.disableProperty().bind(anim.statusProperty().isNotEqualTo(Animation.Status.RUNNING));
resumeButton.disableProperty().bind(anim.statusProperty().isNotEqualTo(Animation.Status.PAUSED));
stopButton.disableProperty().bind(anim.statusProperty().isEqualTo(Animation.Status.STOPPED));

如果您想使用 Java 等静态语言而不是 JavaScript 之类的脚本语言作为控制器,则需要找到在客户端上获取已编译类文件的方法。例如,通过在服务器上编译并拥有一个可以从服务器加载它的类加载器,或者通过在客户端应用程序中提供 java 编译器并在那里编译源代码。

于 2013-10-28T05:41:03.870 回答
1

有一个可以从服务器加载它的类加载器

您还可以查看我的 WebFX 分支 ( https://github.com/pjBooms/webfx ),它允许使用我的 Java ReStart 技术 ( https://github.com/pjBooms/ ) 从 FXML 引用位于远程服务器上的 Java 类Java-重新启动)。

于 2014-11-22T06:38:36.793 回答