对齐文本和编辑 uicontrols

Aligning text and edit uicontrols

我正在创建 GUI,我希望在那里有输入和结果。

我有 text 个字段作为标签,editpopup 作为输入。当我有

uicontrol('style','text','string','foo','units','centimeters','position',[1 1 1 0.5]);
uicontrol('style','edit','string','foo','units','centimeters','position',[2 1 1 0.5]);

我得到 foo 字符串稍微错位,text 字段的基线略高于 edit/pop 字段的基线。

如何对齐这些字段?

不幸的是,这需要访问底层 Java。方法类似于Amro's approach here for a pushbutton and utilizes the external findjobj函数:

h.t = uicontrol('style','text','string','foo','units','centimeters','position',[1 1 1 0.5]);
h.e = uicontrol('style','edit','string','foo','units','centimeters','position',[2 1 1 0.5]);
jh = findjobj(h.t);
jh.setVerticalAlignment(javax.swing.JLabel.CENTER)

不幸的是,这仍然相差一两个像素:

我想说的是根据需要逐个像素地碰撞文本框:

oldunits = get(h.t, 'Units');
set(h.t, 'Units', 'Pixels');
pos = get(h.t, 'Position');

pos(2) = pos(2) + 1;

set(h.t, 'Position', pos)
set(h.t, 'Units', oldunits)

这给了我们:


编辑:修改编辑框的BackgroundColor 属性没有效果(虽然设置为none使其成为黑框...),框将保持默认颜色。根据 MathWorks,这是一个 design decision:

This is a expected behavior in the way that MATLAB displays the BackgroundColor for editable text objects.

这也很可能通过利用底层 Java 来更新,但我不熟悉。

另一种选择是使用 Jlabel,它是一个 Java 组件。我发现来自 undocumentedMatlab 的 uicomponent 很有帮助。您可以使用 link:https://uk.mathworks.com/matlabcentral/fileexchange/14583-uicomponent-expands-uicontrol-to-all-java-classes

从 Mathworks File Exchange 下载它

看这个例子:

figure(1);clf;

[txt1, txt2] = uicomponent(gcf, 'style','JLabel'); % simple spinner with initial value
set(txt1, 'Text', 'Test', 'units','centimeters','position',[1 1 1 1]);
set(txt2, 'horizontalAlignment', javax.swing.SwingConstants.LEFT);
set(txt2, 'VerticalAlignment', javax.swing.SwingConstants.CENTER);

uicontrol('style','edit','string','foo','units','centimeters','position',[2 1 1 1]);

它可以创建如下所示的 UI: