如何从八度图形中删除GUI元素?

时间:2019-06-04 23:07:08

标签: matlab user-interface octave

Octave相对较新,我正在创建一个简单的图形窗口,其中在轴对象中包含一个绘图,并且一些uicontrol对象可以操纵该绘图。到现在为止,一切都很简单,我制作了图形,轴和uicontrols

figure(1, 'position', ...
h.ax = axes(...
h.button = uicontrol('style', 'pushbutton', 'string', 'press me', 'callback', @func)
h.label = uicontrol(...
guidata(gcf, h)

问题来自我的按钮回调之一。当按下按钮时,不仅情节发生了变化,而且我还需要从gui中删除元素之一,例如uicontrol标签。我发现从图形窗口中获取gui元素的唯一方法是删除uicontrol对象,因此我的回调看起来像

function func (obj)
  h = guidata(obj);

  delete(h.label);
  ...

  guidata(obj, h);
endfunction

这将产生“错误:guidata:H必须是图形回调函数中的有效对象句柄执行错误”。

我怀疑我的错误对于掌握了Octave / Matlab中图形处理方式的人来说是显而易见的。了解出了什么问题对您有很大的帮助。

2 个答案:

答案 0 :(得分:0)

您可以将其@SuppressLint("RestrictedApi") override fun setupDialog(d: Dialog?, style: Int) { super.setupDialog(d, style) dialogExampleBinding = DataBindingUtil .inflate(LayoutInflater.from(context), R.layout.dialogExample, null, false) //This is for data binding only d?.setContentView(R.layout.dialogExample) val myDialog:BottomSheetDialog = d as BottomSheetDialog val dField = myDialog.javaClass.getDeclaredField("behavior") //This is the correct name of the variable in the BottomSheetDialog class dField.isAccessible = true val behavior = dField.get(d) as BottomSheetBehavior<*> behavior.setBottomSheetCallback(object : BottomSheetBehavior.BottomSheetCallback() { override fun onStateChanged(bottomSheet: View, newState: Int) { if (newState == BottomSheetBehavior.STATE_DRAGGING) { behavior.state = BottomSheetBehavior.STATE_EXPANDED } } override fun onSlide(bottomSheet: View, slideOffset: Float) {} }) } 属性设置为uicontrol,而不是删除visible对象。这样,off仍然存在,您看不到它。

来自https://octave.org/doc/v4.2.0/Uicontrol-Properties.html

  

uicontrol:“ visible” | {“ off}

     

如果可见为“ on”,则不会在屏幕上显示off

答案 1 :(得分:0)

您的代码不完整,因此我无法评论特定的错误……但是,此代码对我有用(以八度为单位):

function testo()
  figure(1, 'position', [10, 10, 400, 400]);
  h.ax = axes('position', [0,0,1,1]);
  h.button = uicontrol('style', 'pushbutton', 'string', 'press me', 'position', [10, 50, 100, 50], 'callback', @func);
  h.label1 = uicontrol('style', 'text', 'string', 'label1', 'position', [120, 50, 100, 50]);
  h.label2 = uicontrol('style', 'text', 'string', 'label2', 'position', [230, 50, 100, 50]);
  guidata(gcf, h)
endfunction

function func (obj,evnt)
  h = guidata(obj);
  delete(h.label1);
  guidata(obj, h);
endfunction

请注意,如果再次按下按钮,则会看到错误。因此,也许问题不在于删除标签本身,而是删除实际上不存在的其他标签。