Передача объекта MATLAB в качестве входного параметра на Java

1

У меня есть GUI на MATLAB с редактированием uicontrol. Ive создал библиотеку java jar, которую я использую в своем коде. Я хочу передать этот uicontrol в качестве входного параметра конструктору на Java. Причина в том, что мне нравится изменять результат свойства String внутри Java.

Этот псевдокод может быть примером:

MATLAB

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

Ява

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" для переноса uicontrols: http://www.mathworks.com/matlabcentral/fileexchange/14317-findjobj-find-java-handles-of-matlab-graphic-objects

Я не уверен, что он действителен только в среде MATLAB... Большое спасибо за вашу помощь.

Теги:
swing
parameter-passing
jtextfield

1 ответ

1
Лучший ответ

У меня мало опыта с этим, но findjobj должен предоставить вам доступ к основному дескриптору Java-peer из "Редактировать uicontrol".

Следующие работали для меня:

>> 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!')

Изображение 174551

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..

  • 0
    Ты гений! Я думал о передаче объекта и так далее, но на самом деле код ключевой строки: java (handle (jh)).
  • 0
    Кстати, он (setText ()) также работает на стороне Android. Я действительно благодарен!
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню