gpt4 book ai didi

java - 如何知道 OpenOffice Calc UNO 对象支持的 Java 接口(interface)(通过 queryInterface)

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:49:30 25 4
gpt4 key购买 nike

我正在为 OpenOffice Calc 开发一个“宏”。作为语言,我选择了 Java,以便在 Eclipse 中获得代码帮助。我什至编写了一个小的 ant 构建脚本,用于编译并将“宏”嵌入到 *.ods 文件中。总的来说,这工作得很好,而且速度出奇地快;我已经非常成功地使用了一些简单的东西。

但是

我经常被卡住,因为使用 UNO,我需要“查询”任何给定的非平凡对象的接口(interface),以便能够访问该对象的数据/调用方法。也就是说,我确实需要猜测给定对象可能提供哪些接口(interface)。这一点一点都不明显,甚至在 Java 开发过程中(通过某种元信息、反射等)都不可见,而且文档也很少(我下载了很多东西,但我没有找不到我正在使用的接口(interface)的源代码或 JavaDoc,例如 XButtonXPropertySet 等 - XButtonsetLabel ,但不是 getLabel - 什么??)。

有在线文档(对于最基本的概念,一点也不差!),但是它缺少我所面对的许多细节。它总是神奇地恰好停在我需要解决的问题上。

我愿意查看 C++ 代码以了解对象(例如,我目前遇到的按钮/事件)可能提供的接口(interface)。令人困惑的是,C++ 类和文件名与 Java 接口(interface)并不完全匹配。这几乎是我正在寻找的东西,但在 Java 中我并没有真正找到等效的东西,在给定对象上调用 queryInterface返回 null.. 这变得有点令人沮丧。

UNO Java 接口(interface)是如何生成的?代码中是否有某种文档作为生成的 (Java) 代码的来源?

我认为我真的需要知道什么时候可用的接口(interface),以便在 Java-UNO-macro 开发过程中变得更加流畅。 p>

最佳答案

对于任何严肃的 UNO 项目,请使用内省(introspection)工具。

例如,我在 Calc 中创建了一个按钮,然后使用 Java Object Inspector浏览到按钮。 右键单击并选择“添加到源代码”生成以下内容。

import com.sun.star.awt.XControlModel;
import com.sun.star.beans.XPropertySet;
import com.sun.star.container.XIndexAccess;
import com.sun.star.container.XNameAccess;
import com.sun.star.drawing.XControlShape;
import com.sun.star.drawing.XDrawPage;
import com.sun.star.drawing.XDrawPageSupplier;
import com.sun.star.sheet.XSpreadsheetDocument;
import com.sun.star.sheet.XSpreadsheets;
import com.sun.star.uno.AnyConverter;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.uno.XInterface;

//...
public void codesnippet(XInterface _oUnoEntryObject){
try{
XSpreadsheetDocument xSpreadsheetDocument = (XSpreadsheetDocument) UnoRuntime.queryInterface(XSpreadsheetDocument.class, _oUnoEntryObject);
XSpreadsheets xSpreadsheets = xSpreadsheetDocument.getSheets();
XNameAccess xNameAccess = (XNameAccess) UnoRuntime.queryInterface(XNameAccess.class, xSpreadsheets);
Object oName = xNameAccess.getByName("Sheet1");
XDrawPageSupplier xDrawPageSupplier = (XDrawPageSupplier) UnoRuntime.queryInterface(XDrawPageSupplier.class, oName);
XDrawPage xDrawPage = xDrawPageSupplier.getDrawPage();
XIndexAccess xIndexAccess = (XIndexAccess) UnoRuntime.queryInterface(XIndexAccess.class, xDrawPage);
Object oIndex = xIndexAccess.getByIndex(0);
XControlShape xControlShape = (XControlShape) UnoRuntime.queryInterface(XControlShape.class, oIndex);
XControlModel xControlModel = xControlShape.getControl();
XPropertySet xPropertySet = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, xControlModel);
String sLabel = AnyConverter.toString(xPropertySet.getPropertyValue("Label"));
}catch (com.sun.star.beans.UnknownPropertyException e){
e.printStackTrace(System.out);
//Enter your Code here...
}catch (com.sun.star.lang.WrappedTargetException e2){
e2.printStackTrace(System.out);
//Enter your Code here...
}catch (com.sun.star.lang.IllegalArgumentException e3){
e3.printStackTrace(System.out);
//Enter your Code here...
}
}
//...

Python-UNO 可能比 Java 更好,因为它不需要查询特定的接口(interface)。 XrayTool 和 MRI 也比 Java Object Inspector 更易于使用。

关于java - 如何知道 OpenOffice Calc UNO 对象支持的 Java 接口(interface)(通过 queryInterface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46075864/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com