2013-10-23 43 views
0

我試圖用JavaFX替換JSP,HTML和JavaScript,所以我將FXML文件和業務邏輯保存在web服務器中。我可以從服務器加載FXML,並通過簡單的JavaFX(Java)代碼將它們顯示在客戶端,但我無法動態加載事件處理程序(Controller)。我想讓客戶端應用程序輕量級應用程序。如何從Web服務器動態加載FXML?

有人可以建議一個更好的方法來做到這一點?

編輯: 我們必須指定FXML文件中的事件處理程序類的名稱。事件處理程序的對象在通過FXMLLoader加載fxml時被實例化。 我在tomcat服務器中保留了fxml和event handler類。 我創建了一個使用URLConnection從服務器加載fxml的應用程序。 現在加載了fxml,但我無法處理fxml文件中定義的控件的事件。 因爲當通過FXMLLoader加載fxml時,事件處理程序類也被FXMLLoader實例化。 在我的客戶端應用程序事件處理程序類不可用。 但事件處理程序在tomcat服務器中可用。 是否有任何方法從服務器加載類文件,並動態實例化客戶端的類文件(事件處理程序)。

+0

「動態加載控制器」是什麼意思?你能提供一個代碼示例嗎? – Sebastian

回答

3

使用JavaScript等腳本語言是從服務器加載fxml頁面與一些相關控制邏輯的一種方式,這樣客戶端計算機上就不需要編譯 - 它與建立的html + JavaScript模型非常相似。

您可以嘗試WebFX這種方法的一個例子。

metronome.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> 

metronome.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)); 

如果不是一種腳本語言如JavaScript你想使用Java等靜態語言的控制器,你需要找到方法來獲得編譯客戶端上的類文件。例如,通過在服務器上編譯並具有可從服務器加載它的類加載器,或者通過將Java編譯器與您的客戶端應用程序一起發送並在那裏編譯源代碼。具有