如何处理活动对象MATLAB GUI

时间:2016-11-01 15:29:14

标签: matlab user-interface matlab-guide

我正在尝试使用MATLAB GUI创建日历。 我有两个Edit Text个对象 - edittext1edittext2

我想这样做: 我将光标放在edittext1,然后在日历处选择日期,并将其放入edittext1的文本字段中。 对于edittext2也是如此:如果我将光标放入edittext2并选择日期,则会将其放入edittext2编辑文本。

我知道我可以用这种方式回拨日历。

问题:

如何将回调函数处理程序放入ACTIVE编辑文本对象? 如何处理光标所在的对象?

1 个答案:

答案 0 :(得分:1)

关于焦点问题,当您单击日历上的日期时,没有活动文本框,因为活动组件位于这次 java日历。

要知道哪个文本框处于活动最后,您只需跟踪它即可。一种方法是在编辑框中添加一个回调,它将使用最新活动文本框的句柄更新变量(存储在appdata中)。

有了这个,日历的回调将只检索日期,然后将其放在最后一个活动的文本框中。

注意:如果文本框ButtonDownFcn属性为'enable'或{{},则文本框的'off'事件将仅在左侧右键单击时触发1}}。 (如果是'inactive',则仅检测到右键单击)。这就是我将文本框声明为'on'的原因。这并不妨碍您以编程方式更新文本,因此我认为这不是问题。

inactive的代码:

testcalendar.m

看到它的实际效果:

interactive calendar

修改

没有纯Matlab方法可让您的Matlab编辑框完全可编辑 响应(触发事件)只需单击任何鼠标按钮。
您可以使用java对象下的文本框来获得此功能。这个java对象公开了很多事件,你可以选择你需要的那个。

捕获:
要获取底层java对象的句柄,您需要使用 Yair Altman 的全能function testcalendar handles.f = figure; commonEditProperties = {'Style', 'edit', 'String', '', ... 'Units', 'Normalized', ... 'Enable','inactive' , ... 'callback',@EditBoxFcn , ... 'ButtonDownFcn',@EditBoxFcn } ; handles.ledit = uicontrol( commonEditProperties{:}, 'Position', [0.1 0.1 0.3 0.1], 'Tag','ledit' ); handles.redit = uicontrol( commonEditProperties{:}, 'Position', [0.5 0.1 0.3 0.1], 'Tag','redit' ); % preallocate a variable to hold the active text box handle setappdata(handles.f,'activeTextBox',[]) ; com.mathworks.mwswing.MJUtilities.initJIDE; % Put calendar to my figure handles.jPanel = com.jidesoft.combobox.DateChooserPanel; [handles.hPanel,handles.hContainer] = javacomponent(handles.jPanel,[100,100,200,200], handles.f); juiFunHandle = handle(handles.jPanel, 'CallbackProperties'); set(juiFunHandle, 'MousePressedCallback', ... @(src, evnt)CellSelectionCallback(src, evnt, handles)); set(juiFunHandle, 'KeyPressedCallback', ... @(src, evnt)CellSelectionCallback(src, evnt, handles)); % store gui handles in application data guidata(handles.f , handles) end function EditBoxFcn(hobj,~) handles = guidata(hobj) ; ActiveTextBox = get(hobj,'Tag') ; setappdata( handles.f , 'activeTextBox', handles.(ActiveTextBox) ) ; end function CellSelectionCallback(~, ~, handles) % retrieve the handle of the active text box ActiveTextBox = getappdata(handles.f,'activeTextBox') ; % assign a default active text box if none was selected before if isempty(ActiveTextBox) ; ActiveTextBox = handles.ledit ; end numRetry = 10 ; for k=1:numRetry pause(0.1) dateString = char( javaMethodEDT('getSelectedDate', handles.jPanel) ) ; if ~isempty(dateString) ; break ; end end set(ActiveTextBox , 'String' , dateString ) ; end 实用程序。您可以在此处从文件交换中心下载最新版本:findjobj

保存在Matlab路径中后,只需将以下示例中给出的编辑框的几行代码替换为:

findjobj

您可以完全注释或删除子函数commonEditProperties = {'Style', 'edit', 'String', '', 'Units', 'Normalized', 'Enable','on' } ; handles.ledit = uicontrol( commonEditProperties{:}, 'Position', [0.1 0.1 0.3 0.1] ); handles.redit = uicontrol( commonEditProperties{:}, 'Position', [0.5 0.1 0.3 0.1] ); % preallocate a variable to hold the active text box handle setappdata(handles.f,'activeTextBox',[]) ; % Find the java underlying object for the text boxes ledit = findjobj(handles.ledit) ; redit = findjobj(handles.redit) ; % assign a callback to the java object (which CAN detect single click) set(ledit,'MouseClickedCallback',@(h,e) setappdata( handles.f , 'activeTextBox', handles.ledit ) ) ; set(redit,'MouseClickedCallback',@(h,e) setappdata( handles.f , 'activeTextBox', handles.redit ) ) ; ,因为回调操作是直接完成的。