【问题标题】:Opening a TCL gui within Java code在 Java 代码中打开 TCL gui
【发布时间】:2013-04-17 21:35:40
【问题描述】:

我有一个 TCL 文件,它使用 Tcl 的 BWidget 包,我一直将它用作我的程序的 GUI。我现在希望能够从一个单独的 Java 程序加载这个 GUI。我调查过 Jacl 和 Swank,但他们似乎并没有完全按照我的意愿行事。

我已尝试使用 Jacl 进行以下操作,但无法评估文件。在调试时,我可以看到它完成了对我的tcl文件的解析,但是在解析BWidget包的tcl文件时抛出了异常。这是我的 Java 代码:

Interp interp = new Interp();
try {
    interp.evalFile("C:\\CTP\\Tcl\\LuxonCtp32.tcl");
} catch (TclException ex) {
    int code = ex.getCompletionCode();
    System.err.println("command returned bad error code: " + code);
} finally {
    interp.dispose();
}

关于如何完成我想做的事情有什么想法吗?有可能吗?

【问题讨论】:

  • 有什么异常?
  • 在子进程中运行 GUI 可能更容易(参见java.lang.ProcessBuilder); Java 的子进程处理并不是那么好,但它胜过处理大量未移植的代码!
  • @DonalFellows 谢谢你的帮助。我只是在一个子进程中启动了 tcl wish shell 并执行了我的 tcl 脚本。

标签: java tcl jacl bwidget


【解决方案1】:

Tcl 本身不能显示 GUI。它为此使用了一个名为 Tk 的插件。
在 Tcl 的 C 参考实现中,您也可以得到 Tk。
Tk 没有移植到 Java,Tcl 有。

您不能使用 Jacl 来显示 Tk 小部件,但 TclBlend 可以这样做,因为 TclBlend 使用 Tcl 的 C 参考实现。这意味着用户需要一个有效的 Tcl/Tk 安装。

TclBlend 和 Tcl > 8.5 through 存在一些问题,这会导致段错误。
IIRC,您必须在 TclBlends C 代码中删除 Tcl_FindNameOfExecutable 周围的条件 if(并自己编译)。

【讨论】:

    【解决方案2】:

    访问此站点http://jtcl-project.github.io/jtcl/ 并立即下载二进制 zip。它最近在 github 上发布了一个名为 Jtcl 的 java tcl。 解压它,你会发现一个名为 jtcl-2.7.0.jar 的 jar。 我正在使用我的偏好的 Netbeans 8。 我将 jar 添加到项目库中。 我创建了一个名为 JTclHallo.java 的 java 文件,这是代码。

    package jtclhallo;
    // import tcl.lang it belongs to jtcl-2.7.0 jar a must
    
    import tcl.lang.*;
    
     // Java wrapper to test JACL or JTCL.
    
    public class JTclHallo {
        public static void main(String []args) {
    
            //Interp is a java class belonging to tcl.lang. Unrar the jtcl-2.7.0
    
            Interp i = new Interp();
    
    
            try {
    
                //call your tcl file mine was swing.tcl from the E drive
                i.eval("source E:/private/swing.tcl");
                } catch (TclException e) {
                System.out.println("Exception: " + e.getMessage());
                }
    
        }
     }
    

    对于 swing.tcl

    package require java
    
    set window [java::new javax.swing.JFrame]
    $window setSize 600 400
    $window setVisible true
    

    【讨论】:

    • 能否请您用几句话解释您的答案,而不是简单地将代码转储在这里?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-27
    • 1970-01-01
    • 2017-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多