对齐文本和编辑 uicontrols
Aligning text and edit uicontrols
我正在创建 GUI,我希望在那里有输入和结果。
我有 text
个字段作为标签,edit
或 popup
作为输入。当我有
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:
我正在创建 GUI,我希望在那里有输入和结果。
我有 text
个字段作为标签,edit
或 popup
作为输入。当我有
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: