У меня есть 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... Большое спасибо за вашу помощь.
У меня мало опыта с этим, но 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!')
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..