最近遇到一个很烦的问题,搞了很久搞不定,想请各位帮忙,看看有没有解决的办法,我建了个JavaFx应用程序,Main里面要监测一个Java线程中的一个变量的变化,并把变化呈现出来,我搞了很久也没搞定...
[code="java"]
var output = Group {
content: Text{
x : 550
y : 143
content: bind OutputInfo.getIntance().outputInfo
font:Font{
size:30
}
}
}
[/code]
这是Main.fx里面的一小段代码,里面的content内容是绑定到另一个类中的变量
[code="java"]
public class OutputInfo {
public String outputInfo;
private static OutputInfo outputInstance = new OutputInfo("Output:");
OutputInfo(String outputInfo){
this.outputInfo = outputInfo;
}
public static OutputInfo getIntance() {
return outputInstance;
}
}
[/code]
这里就是需要监测的变量outputInfo
我有一个线程,在运行之中把outputInfo改变了
[code="java"]
public void run() {
DBSession db1 = new DBSession();
DBSession db2 = new DBSession();
//设置隔离级别 1为 TRANSACTION_READ_UNCOMMITTED 2为 TRANSACTION_READ_COMMITTED 4为 TRANSACTION_REPEATABLE_READ 8为 TRANSACTION_SERIALIZABLE
db1.setIsolationLevel(value);
db2.setIsolationLevel(value);
db1.setIsAutoCommit(false);
db2.setIsAutoCommit(false);
String sql1 = "UPDATE example SET VALUE=2 WHERE id=1";
String sql2 = "UPDATE example SET VALUE=1 WHERE id=2";
String sql3 = "UPDATE example SET VALUE=2 WHERE id=2";
String sql4 = "UPDATE example SET VALUE=1 WHERE id=1";
OutputInfo.getIntance().outputInfo = db1.executeUpdate(sql1);
OutputInfo.getIntance().outputInfo = db2.executeUpdate(sql2);
OutputInfo.getIntance().outputInfo = db1.executeUpdate(sql3);
OutputInfo.getIntance().outputInfo = db2.executeUpdate(sql4);
db1.rollback();
db2.rollback();
db1.close();
db2.close();
[/code]
我这上面的executeUpdate方法会返回操作是否成功的信息,并把信息赋给OutputInfo中的outputInfo
我自己感觉我应该写的没错,但是为什么不起作用呢,有没有那个大牛帮忙解决一下困惑,感激不尽!
不一定非要按照我的思路来想办法,其他的办法也行,总之,JavaFx中怎么监测Java类中变量的变化呢?
这是个比较典型的JavaFX和Java互操作的问题,可以参考本人文章: [url=http://javafxguy.iteye.com/blog/317087]JavaFX和Java之间的互操作性[/url]。
基本原则是,bind仅限于JavaFX类,对Java类无效。要解决你的问题,可以这么做:
定义一个Java的interface类 JavaInterface.java :
[code="java"]
public interface JavaInterface {
public void doUpdate(String s);
}
[/code]
写一个JavaFX类UpdateClass.fx实现这个interface,如下:
[code="java"]
/*
public class UpdateClass extends JavaInterface {
public override function doUpdate( s: String): Void {
updatedContent = s;
}
}
[/code]
在OutputInfo.java中增加一句声明:
[code="java"]
public static JavaInterface javafxObject ;
[/code]
在Main.fx中,可以这样写:
[code="java"]
OutputInfo.javafxObject = UpdateClass {};
var output = Group {
content: Text{
x : 550
y : 143
content: bind UpdateClass.updatedContent;
font:Font{
size:30
}
}
}
[/code]
最后,在你的run()方法中增加相应的通知功能,如:
[code="java"]
. . . . . .
String result = db1.executeUpdate(sql1);
OutputInfo.javafxObject.doUpdate( result );
result = db1.executeUpdate(sql2);
OutputInfo.javafxObject.doUpdate( result );
. . . . . .
[/code]
希望对你有帮助。更多JavaFX的信息可以可以参考:[url=http://javafxguy.iteye.com]JavaFX Guy博客[/url]
[url=http://www.javafxblogs.com]JavaFX技术应用交流[/url]