用于Tcl的Java GUI

时间:2012-07-10 20:24:12

标签: java user-interface tcl tk jacl

我在用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,但似乎没有关于它的文档,所以我不确定如何继续。

有关如何最好地解决此问题的任何建议?或者在哪里可以找到其他资源?

3 个答案:

答案 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 socketsD-BusWindows 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。