我正在尝试使用MATLAB GUI创建日历。
我有两个Edit Text
个对象 - edittext1
和edittext2
。
我想这样做:
我将光标放在edittext1
,然后在日历处选择日期,并将其放入edittext1
的文本字段中。
对于edittext2
也是如此:如果我将光标放入edittext2
并选择日期,则会将其放入edittext2
编辑文本。
我知道我可以用这种方式回拨日历。
问题:
如何将回调函数处理程序放入ACTIVE编辑文本对象? 如何处理光标所在的对象?
答案 0 :(得分:1)
关于焦点问题,当您单击日历上的日期时,没有活动文本框,因为活动组件位于这次是 java日历。
要知道哪个文本框处于活动最后,您只需跟踪它即可。一种方法是在编辑框中添加一个回调,它将使用最新活动文本框的句柄更新变量(存储在appdata
中)。
有了这个,日历的回调将只检索日期,然后将其放在最后一个活动的文本框中。
注意:如果文本框ButtonDownFcn
属性为'enable'
或{{},则文本框的'off'
事件将仅在左侧和右键单击时触发1}}。 (如果是'inactive'
,则仅检测到右键单击)。这就是我将文本框声明为'on'
的原因。这并不妨碍您以编程方式更新文本,因此我认为这不是问题。
inactive
的代码:
testcalendar.m
看到它的实际效果:
没有纯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 ) ) ;
,因为回调操作是直接完成的。