我正在尝试使用JavaFX-2,其中一项功能据说是我们可以在FXML文件中使用Javascript创建事件处理函数。让我烦恼的一件事是我无法立即访问System类。它需要完全引用,如“java.lang.System”。当我们在控制台上需要一个简单的输出时,这变得很难看,我的意思是,“System.out.println”很难看到打印出来的东西。 而且,即使我的FXML具有所有<?import java.lang。*?>语句,显然它不会影响< fx:script>的内部标签
示例代码:(注意<?language javascript?>
指令)
<?xml version="1.0" encoding="UTF-8"?>
<?language javascript?>
<?import java.lang.*?>
<?import java.net.*?>
<?import java.util.*?>
<?import javafx.collections.*?>
<?import javafx.geometry.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.image.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.paint.*?>
<?import javafx.scene.text.*?>
<AnchorPane fx:id="rootPane">
<fx:script>
function buttonAction(event){
java.lang.System.out.println("finally we get to print something.");
// System.out.println("This wouldn't work even if it wasn't a comment line, anyway");
}
</fx:script>
<children>
<Button id="close" mnemonicParsing="false" onAction="buttonAction(event)" text="">
<graphic>
<ImageView pickOnBounds="true">
<image>
<Image url="@../resources/close.png" preserveRatio="true" smooth="true" />
</image>
</ImageView>
</graphic>
</Button>
</children>
</AnchorPane>
所以我的问题是:有没有办法将类导入到&lt; fx:script&gt;?我记得我在Actionscript3.0中这样做非常简单:import flash.events.MouseEvent
...
答案 0 :(得分:1)
使用javascript内置importPackage
或importClass
函数。
<fx:script>
importPackage(java.lang);
function buttonAction(event){
System.out.println("finally we get to print something.");
}
</fx:script>
有关详细信息,请参阅:http://docs.oracle.com/javase/6/docs/technotes/guides/scripting/programmer_guide/index.html#jsimport
答案 1 :(得分:0)
这有点令人困惑,但是来自Sergey的链接为后台发生的事情提供了良好的上下文(例如,将Java扩展到脚本世界)。
尽管Sergey的解决方案有效,但它在嵌入式脚本中混合了Java类方法,该脚本可能是javascript(根据页面语言声明)。没有浏览器,因此也没有“ console.log()”,因此也许最好避免潜在的java / js混乱,而只需使用print():
<fx:script>
function reactToClick(event) {
print("I was clicked");
}
</fx:script>
下一个问题是print()方法的来源是...。它不是java,也不是js。我认为答案在于用于支持Java / js集成的Nashorn javascript引擎。 Print()是内置函数:Nashorn shell commands.