1

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

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

4

3 回答 3

1

我不熟悉您提到的 Java 库,但从

运行 Tcl 脚本时,我希望将信息传递到此 GUI 并显示。在 GUI 上进一步输入的信息应该能够返回给脚本。

声明您的案例非常适合IPC。我的意思是我只是启动一个 Tcl 程序,通过某种 IPC 连接你正在运行的 Java 和 Tcl 程序,然后使用商定的协议在它们之间进行交换。

最简单的跨平台 IPC 可能使用 TCP 套接字:例如,您的 Java 应用程序在随机端口上打开一个套接字,侦听某个环回接口地址,然后将该套接字的地址传递给它产生的 Tcl 应用程序;然后 Tcl 应用程序连接到那个套接字,两个应用程序确实交换它们的命令和响应。

另一种可能性是使用托管它的 Tcl shell 的标准 IO 通道与脚本通信——stdin 和 stdout:您的 Java 主机将其命令写入衍生的 Tcl 应用程序的 stdin 并从其 stdout 读回其输出。这种方式可能比 TCP 套接字更简单,但需要在 Windows 上进行特殊处理(您必须使用 运行脚本tclsh,而不是wish在后一种情况下,它的标准通道将无处连接)。

如果您不需要跨平台 IPC 并且可以使用外部 Tcl 库,那么您可以通过特定于平台的东西进行通信,例如Unix 域套接字D-BusWindows 命名管道(可以使用 Unix 命名管道而无需额外的包)、DDE等。

于 2012-07-11T07:08:30.597 回答
1

在搜索您的问题可能是什么的背景时,我在 comp.lang.tcl 上找到了这个线程,它解释了这个问题。问题是您没有从 AWT 事件线程创建 GUI。为此,您需要创建一个小的 Java 类来实现RunnableRunner在下面调用)并创建您的 GUI 对象并显示它们。然后,您可以SwingUtilities.invokeLater通过 JTcl 实例化并启动它:

java::call javax.swing.SwingUtilities invokeLater [java::new Runner]

但是,您使用的 JTcl 包含一个包 ( hyde),可让您将 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]

遗憾的是没有更清楚地记录它;它很容易被忽略,因为它位于 jtcllib 文档组中。

于 2012-07-11T09:03:37.490 回答
0

Teamcenter 不支持“外部自定义”。

我分别用 Java 编写了 GUI,最后使用 Teamcenter 的内部 API 来显示 GUI。

于 2012-07-16T19:05:54.140 回答