我的目标如下:Isabelle/jEdit是jEdit对Isabelle定理证明者的扩展。我想使用 shell 命令以编程方式将理论文件的排版、语法突出显示版本转换为图像文件,就像它们出现在屏幕上一样。
这是调用 jEdit 以获取渲染文本的位图的后续内容,其中作者编写了 BeanShell 脚本以将 JTextArea 转换为图像文件。这是脚本:
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
img = new BufferedImage(textArea.getWidth(), textArea.getHeight(), BufferedImage.TYPE_INT_ARGB);
g = img.getGraphics();
textArea.paint(g);
g.dispose();
ImageIO.write(img, "png", new File(".../textArea.png"));
我从命令行调用了它
$ isabelle jedit -j "-run=textarea-snapshot.bsh" MyTheory.thy
但是 BeanShell 脚本的 textArea
未定义,所以我收到了错误。所以我应该得到
JTextArea
的主要
jEdit
来完成这项工作。据我了解,它是在
创建的
https://github.com/albfan/jEdit/blob/master/org/gjt/sp/jedit/gui/RegisterViewer.java#L78
contentTextArea = new JTextArea(10,20);
但不清楚我是否可以从 BeanShell 脚本访问它而不修改 jEdit 的代码。有 jEdit 经验的人可以回答我如何从 BeanShell 脚本中命名这个 contentTextArea 吗?或者说,我怎样才能实现我最初的目标?
textArea
正是访问文本区域的方法。如果您在 jEdit 全新启动期间运行该脚本,它会执行得太早并且文本区域还不存在。
如果你想这样做,你需要编写一个更复杂的脚本,它注册一个
EditBus
组件,从而可以对诸如视图被激活之类的事件做出反应。类似的事情
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
EditBus.addToBus(new EBComponent() {
public void handleMessage(EBMessage message) {
if ((message instanceof ViewUpdate) && (message.getWhat() == ViewUpdate.ACTIVATED)) {
EditBus.removeFromBus(this);
textArea = message.getView().getTextArea();
img = new BufferedImage(textArea.getWidth(), textArea.getHeight(), BufferedImage.TYPE_INT_ARGB);
g = img.getGraphics();
textArea.paint(g);
g.dispose();
ImageIO.write(img, "png", new File("textArea.png"));
}
}
});