Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/428.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从Web服务器动态加载FXML?_Java_Javascript_Javafx 2_Javafx_Javafx 8 - Fatal编程技术网

Java 如何从Web服务器动态加载FXML?

Java 如何从Web服务器动态加载FXML?,java,javascript,javafx-2,javafx,javafx-8,Java,Javascript,Javafx 2,Javafx,Javafx 8,我试图用JavaFX替换JSP、HTML和JavaScript,所以我在webserver中保留了FXML文件和业务逻辑。我可以从服务器加载FXML,并通过简单的JavaFX(java)代码在客户端显示它们,但我不能动态加载事件处理程序(控制器)。我想使客户端应用程序成为轻量级应用程序 有人能提出更好的方法吗 编辑: 我们必须在fxml文件中指定事件处理程序类名。事件处理程序的对象在FXMLLoader加载fxml时实例化。 我在tomcat服务器中保留了fxml和事件处理程序类。 我创建了一个

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

有人能提出更好的方法吗

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

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

您可以尝试此方法的一个示例


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

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

您可以尝试此方法的一个示例

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

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

您还可以检查my fork of WebFX(),它允许使用my Java ReStart技术()从FXML引用位于远程服务器上的Java类

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

您还可以检查my fork of WebFX(),它允许使用my Java ReStart technology()从FXML引用位于远程服务器上的Java类。

什么是“动态加载控制器”?你能提供一个代码示例吗?你说的“动态加载控制器”是什么意思?你能提供一个代码示例吗?
<?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>
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));