Открытие интерфейса 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