Открытие интерфейса TCL в коде Java

У меня есть файл TCL, в котором используется пакет Bcl для Tcl, который я использовал в качестве графического интерфейса для своей программы. Теперь я хочу загрузить этот графический интерфейс из отдельной Java-программы. Я смотрел на Жакла и Суонка, но они, кажется, не делают именно то, что я хочу.

Я пробовал следующее с Жаклом, но он не может оценить файл. Во время отладки я вижу, что он выполняет синтаксический анализ моего tcl-файла, но выдает исключение при разборе tcl-файлов пакета BWidget. Вот мой код 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();
}

Любые идеи о том, как я могу сделать то, что я хочу сделать? Это вообще возможно?

2 ответа

Сам Tcl не может отображать графический интерфейс. Для этого используется плагин под названием Tk.
В эталонной реализации Tcl на C вы также получаете Tk.
Tk не был портирован на Java, Tcl имеет.

Вы не можете использовать Jacl для отображения виджетов Tk, но TclBlend может сделать это, потому что TclBlend использует C-реализацию Tcl. Это означает, что пользователю нужна рабочая установка Tcl/Tk.

Есть некоторые проблемы с TclBlend и Tcl > 8.5, которые приводят к segfault.
IIRC вы должны удалить условный if вокруг Tcl_FindNameOfExecutable в коде TclBlends C (и скомпилируйте его самостоятельно).

Перейдите на этот сайт http://jtcl-project.github.io/jtcl/ и загрузите сейчас для двоичного zip. Это недавний java tcl на github под названием Jtcl. Разархивируйте его, и вы найдете банку с именем jtcl-2.7.0.jar. Я использую Netbeans 8 мои предпочтения. Я добавляю банку в библиотеку проектов. Я создаю файл Java с именем JTclHallo.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
Другие вопросы по тегам