MATLAB:工具栏按钮没有从图形句柄接收更新的字符串。

时间:2014-09-10 17:24:26

标签: matlab

我有一个带有编辑框和工具栏上的按钮的GUI(好吧,还有更多的东西,但这些是唯一重要的东西!)无论如何,当你按下按钮工具时我就这样做了变量设置为等于编辑框中的字符串。一个简单的var = get(handles.edit1, 'string')。但是,当我直接从框中输入值到点击按钮(不点击其他任何地方或按返回)时,var会在编辑框中分配前一个值。为什么是这样?有没有办法确保按钮工具能够选出正确的值?

如果重要的话,GUI是使用指南制作的。

2 个答案:

答案 0 :(得分:2)

这种情况正在发生,因为uipushtool回调正在文本框有时间验证之前执行。肯定有一种更优雅的方式可以做到这一点,但这个技巧有效:

您可以使用waitfor命令告诉uipushtool回调等待可编辑框验证其输入。不幸的是,这还不够,所以我们必须:

1)将焦点传递给虚拟控件(我创建了一个名为pushbutton1的虚拟pushbutton,它不执行任何操作。焦点可以发送到任何其他虚拟控件。

2)现在等待文本框验证其内容。

3)文本框完成后,以传统方式检索内容。

此方法要求:
- 用于将焦点发送到的虚拟控件(但您也可以使用真实的) - 可编辑框的虚拟(或非)回调函数。 (waitfor指令将等待回调完成,如果没有回调,则会出错

function uipushtool1_ClickedCallback(hObject, eventdata, handles)

    uicontrol( handles.pushbutton1 ) ; %// pass the focus to a dummy control
    waitfor(handles.edit1,'String');   %// wait for the editable box to validate its content
    var = get(handles.edit1, 'string') ; %// now retrieve the editable box content

    set( handles.text1 , 'String' , var ) %// this can be deleted, just to verify the method

% --------------------------------------------------------------------

function edit1_Callback(hObject, eventdata, handles)
    %// This is the dummy callback function for the editable box
    %// Do absolutely nothing here (or do if you want ... your choice)

修改

正如我所担心的那样,我的初始解决方案太脏了,不够健壮。有2个(或更多)文本框,我尝试了很多东西但没有成功。我放弃了等待,我注意到在某些情况下,当按下uipushtool时,编辑框的回调会激活但是uipushtool根本不会执行...所以我试图直接从编辑框回调管理事物=>从编辑框keypressedFcn发送我们输入的每个字符到一个变量...但即使这个编辑框回调在执行时也不知道编辑框的内容?? (这个link提供了一个非常简单的例子来重现那个)。

因此,令我非常失望的是,我不得不诉诸“外部”。解。 (如果你接受它变得非常简单)。诀窍是检索 Java EditBox对象的句柄。一旦我们掌握了手柄,就可以实现"实时"内容只是将 Java string转换为 Matlab string

要检索Java对象句柄,需要Matlab中心的函数FindJObj

将它放在matlab路径中的任何位置,然后按钮的代码变为类似:
为了确保文本框和uipushtools之间没有干扰,我制作了2个独立的uipushtools,每个uipushtools控制1个编辑框

function uipushtool1_ClickedCallback(hObject, eventdata, handles)
    jEditbox = findjobj(handles.edit1); %// get the handle of the java editbox #1
    var = char(jEditbox.getText) ; %// retrieve Java string and convert it to matlab string

    disp(['uipushtool1_ClickedCallback running. Textbox1 content = ' var ]) %// debug line, you can delete or comment that

% --------------------------------------------------------------------
function uipushtool2_ClickedCallback(hObject, eventdata, handles)
    jEditbox = findjobj(handles.edit2); %// get the handle of the java editbox #2
    var = char(jEditbox.getText) ; %// retrieve Java string and convert it to matlab string

    disp(['uipushtool2_ClickedCallback running. Textbox2 content = ' var ]) %// debug line, you can delete or comment that

感谢 Yair Altman 提供findjobj函数,以及Matlab用户的许多其他贡献。

答案 1 :(得分:0)

我尝试复制您的问题,并使用仅带按钮和编辑字段的指南创建了一个新的GUI。如果我将按钮回调设置为:

function pushbutton1_Callback(hObject, eventdata, handles)
get(handles.edit1,'string')

它始终打印编辑字段的当前值,无论我是否在输入值后点击其他位置。您使用的是哪个版本的Matlab?我用Matlab 2010a测试了它。