我在用Java编写可以与Tcl脚本交互的GUI时遇到了一些麻烦。运行Tcl脚本时,我希望将信息传递给此GUI并显示。有关GUI的更多输入信息应该能够返回到脚本。
我目前正在使用Tcl / Java。不幸的是,我使用的是Teamcenter,根据用户手册,不支持Tk工具包。所以我想再次使用Swing。
这是我试图为Swing工作的东西,但是当我运行脚本时没有任何显示:
package require java
java::import javax.swing.JFrame
set window [java::new javax.swing.JFrame]
$window setSize 100 100
$window setVisible true
我也发现了Swank,但似乎没有关于它的文档,所以我不确定如何继续。
有关如何最好地解决此问题的任何建议?或者在哪里可以找到其他资源?
答案 0 :(得分:1)
我不熟悉你提到的Java库,但从
来判断运行Tcl脚本时,我希望将信息传递给此GUI并显示。有关GUI的更多输入信息应该能够返回到脚本。
声明您的案例非常适合IPC。我的意思是我只是启动一个Tcl程序,通过某种IPC连接正在运行的Java和Tcl程序,然后使用商定的协议进行交换。
最简单的跨平台IPC可能使用TCP套接字:比如说,你的Java应用程序在一个随机端口上打开一个套接字,监听一些环回接口地址,然后将这个套接字的地址传递给它产生的Tcl应用程序;然后,Tcl应用程序connects到该套接字,两个应用程序都交换命令和响应。
另一种可能性是使用托管它的Tcl shell的标准IO通道与脚本进行通信 - stdin和stdout:您的Java主机将其命令写入生成的Tcl应用程序的stdin并从其stdout读回其输出。这种方式可能比TCP套接字更简单,但需要在Windows上进行特殊处理(您必须使用tclsh
运行脚本,而不是wish
,因为在后一种情况下,它将使其标准通道无处连接)
如果您不需要跨平台IPC并且可以使用外部Tcl库,那么您可以通过特定于平台的内容进行通信,例如Unix-domain sockets,D-Bus,Windows named pipes(可以在没有额外包的情况下使用Unix命名管道,DDE等。
答案 1 :(得分:1)
在搜索问题的背景时,我找到this thread on comp.lang.tcl来解释问题。问题是您没有从AWT事件线程创建GUI。为此,您需要创建一个实现Runnable
的小型Java类(下面称为Runner
),并创建GUI对象并显示它们。然后,您可以通过JTcl实例化并通过SwingUtilities.invokeLater
激活:
java::call javax.swing.SwingUtilities invokeLater [java::new Runner]
但是,您正在使用包含一个包(hyde
)的JTcl,它允许您将Java代码放在Tcl代码中:
package require java
package require hyde
hyde::jclass Runner -package your.helper -implements Runnable {
public void run() {
your.Frame f = new your.Frame();
// ...
f.setVisible(true);
}
}
java::call javax.swing.SwingUtilities invokeLater [java::new your.helper.Runner]
遗憾的是,它不是documented more clearly;它很容易被遗漏,因为它位于jtcllib文档组中。
答案 2 :(得分:0)
Teamcenter不支持"外部自定义"。
我分别用Java编写GUI,最后使用Teamcenter的内部API来显示GUI。