如何使用 Matlab App Designer 在标签中包装文本

How to wrap text in a label using Matlab's App Designer

我正在使用 Matlab 的 App Designer 制作一个 GUI 应用程序。我有一个标签,我将其放入 GUI 中,用于向用户提供说明。随着他们的进行,说明文本的长度会有所不同。当文本长度到达标签末尾时,它给出 ... 并切断消息。我希望文本环绕在标签内。

我试过textwrap,但它给了我一个错误,指出父项不能是标签。

要重现,请在 Matlab 的 App Designer 上创建一个新应用程序,将标签拖放到 canvas 上,然后在其中键入一个长文本。标签大小将调整以使其离开应用 window。如果您将标签宽度调整回来,它只会切断带有 ... 的文本,如下所示:

Run 不会改变它。

当我将文本更改为没有新行的字符串时,这是我想要自动生成的内容:

我用来更改文本的代码是这样的:

methods (Access = private)

    % Callback function
    function ButtonPushed(app, event)
        app.Label.Text = "Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus scelerisque nisi ac enim faucib porttitor velit varius. Phasellus luctus ullamcorper nul sit amet finibus neque vehicula ut. Nulla pellentesque.";
    end
end

我希望我不需要重新发明轮子和设计我自己的文本环绕功能。是否有文档中尚未阐明的执行此操作的方法?

您可能不再需要它,但对于遇到与 OP 和我相同问题的任何人:我已经为 textwrap 编写了一个包装器。这是:

function wrapLabelText(label, txt)
    % Create a uicontrol whose text will look like that of the label.
    h = uicontrol( ...
    'Style', 'Text', ...
    'Parent', figure('Visible', 'off'), ... % Make sure the containing figure is invisible.
    'Position', label.Position, ...
    'FontUnits', 'pixels', ... % By default App Designer uses 'pixels' but uicontrol uses 'points'. Define before the FontSize!
    'FontSize', label.FontSize, ...
    'FontName', label.FontName, ...
    'FontAngle', label.FontAngle, ...
    'FontWeight', label.FontWeight, ...
    'HorizontalAlignment', label.HorizontalAlignment ...
    );

    % Determine where the text will be wrapped.
    outtext = textwrap(h, {txt});
    delete(h);

    % Assign the text to the label.
    label.Text = outtext;
end

第一个输入是 uilabel 对象,第二个是您想要作为 Text 属性 的文本。因为我们正在创建一个图形并再次删除它,所以它不是非常快(更新约 0.05 秒)。在您的代码中,您可以将其称为:

% Callback function
function ButtonPushed(app, event)
    txt = 'Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus scelerisque nisi ac enim faucib porttitor velit varius. Phasellus luctus ullamcorper nul sit amet finibus neque vehicula ut. Nulla pellentesque.';
    wrapLabelText(app.Label, txt);
end

结束

直接在 uilabel 上使用 textwrap 不起作用的原因是因为 textwrap 适用于使用 GUIDE 而不是 App Designer 创建的组件。 App Designer 可能有替代品,但我不知道。

或者,您可以使用 "Edit Field (Text)" 组件而不是标签,它会自动换行文本。

非常感谢您的代码,由于某种原因它在我的 MATLAB 2019b 中不起作用,通过在这一行中添加最大文本宽度选项来修复:

*outtext = textwrap(h, {txt}, 20);*

20 表示最大文本宽度为 20 个字符。