【问题标题】:Passing a MATLAB object as an input parameter on Java在 Java 上将 MATLAB 对象作为输入参数传递
【发布时间】:2014-07-09 07:04:50
【问题描述】:

我在 MATLAB 上有一个带有编辑 uicontrol 的 GUI。我制作了一个 Java jar 库,用于我的代码。我想将此 uicontrol 作为输入参数传递给 Java 上的构造函数。 原因是我喜欢在Java中改变String属性的结果。

这个伪代码可以是一个例子:

MATLAB

javaaddpath('myjar.jar'); % Adding Java library
import <packagename>.*; % Route
server = ConstructorName( handles.<myUiControl> ); % IS HERE WHERE I DON'T KNOW WHAT TO PUT

Java

ConstructorName(JTextField jTF) {
jTF.setText("whatever");

}

有可能吗?也许不支持我想做的事情......在这个页面中讲述了它可以作为一个 Java 对象,但不是在追逐 MATLAB 对象: http://www.mathworks.es/es/help/matlab/matlab_external/passing-data-to-a-java-method.html

但我已经看到我可以使用“findobj”来包装 uicontrol: http://www.mathworks.com/matlabcentral/fileexchange/14317-findjobj-find-java-handles-of-matlab-graphic-objects

我不确定它是否仅在 MATLAB 环境中有效... 非常感谢您的帮助。

【问题讨论】:

    标签: java swing matlab parameter-passing jtextfield


    【解决方案1】:

    我对此没有多少经验,但findjobj 应该让您可以访问“编辑 uicontrol”的底层 Java 对等句柄。

    以下内容对我有用:

    >> figure('Menubar','none', 'Position',[400 400 250 100]);
    >> h = uicontrol('Style','edit', 'Position',[30 40 200 25], 'String','')
    h =
        0.0101
    
    >> drawnow; pause(0.1);
    >> jh = findjobj(h, 'nomenu')
    jh =
        javahandle_withcallbacks.com.mathworks.hg.peer.EditTextPeer$hgTextField
    
    
    >> jedit = java(handle(jh))
    jedit =
    com.mathworks.hg.peer.EditTextPeer$hgTextField[...TRUNCATED STUFF...]
    

    这是一个类对象:com.mathworks.hg.peer.EditTextPeer$hgTextField。这源自com.mathworks.mwswing.MJTextField,它本身扩展了标准javax.swing.JTextField

    接下来我们将对象引用传递给 Java 代码。我必须将构造函数编写为接受Object 并将其转换为JTextField

    >> javaaddpath('C:\path\to\my\java\classes')
    
    >> c = MyClass(jedit)
    c =
    MyClass@483e74d7
    
    >> c.setString('hello world!')
    

    MyClass.java

    import javax.swing.JTextField;
    public class MyClass {
        private JTextField jtf = null;
        public MyClass(Object obj) {
            jtf = (JTextField) obj;
        }
        public void setString(String str) {
            jtf.setText(str);
        }
    }
    

    当然,这都是无证的,而且 MathWorks 完全不支持..

    【讨论】:

    • 你是个天才!本来想传一个Object之类的,其实关键行代码是:java(handle(jh)).
    • 顺便说一下,它 (setText()) 也适用于 Android 端。真的很感谢!
    • 谢谢 :) 您实际上可以在edit javaGetHandles.m 中看到 MATLAB 内部使用的这段代码来获取 Java 句柄
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多