Как обернуть текст в метку с помощью конструктора приложений Matlab

Я делаю приложение с графическим интерфейсом, используя конструктор приложений Matlab. У меня есть метка, которую я вставил в графический интерфейс и которая будет служить инструкциями для пользователя. По мере их продвижения длина текста инструкций будет меняться. Когда длина текста достигает конца метки, он дает ... и обрезает сообщение. Я хочу, чтобы текст обернулся внутри метки.

Я попробовал textwrap, но выдал ошибку о том, что родитель не может быть ярлыком.

Чтобы воспроизвести, создайте новое приложение в конструкторе приложений Matlab, перетащите метку на холст и введите в нее длинный текст. Размер метки будет изменен, чтобы позволить ей выйти за пределы окна приложения. Если вы отрегулируете ширину метки обратно, она просто обрежет текст с помощью ..., например: Setup

Нажатие Run не меняет его.

Это то, что я хочу создать автоматически, когда я изменяю текст на строку без новых строк: Desired

Код, который я использую для изменения текста, выглядит следующим образом:

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

Я надеюсь, что мне не нужно изобретать велосипед и разрабатывать собственную функцию переноса текста. Есть ли способ сделать это, который еще не разъяснен в документации?


person Philosophist    schedule 12.04.2019    source источник


Ответы (2)


Возможно, вам это больше не нужно, но для тех, у кого такая же проблема, как у 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

конец

Причина, по которой использование textwrap непосредственно на ulabel не работает, заключается в том, что textwrap предназначен для компонентов, созданных с помощью GUIDE, а не App Designer. Возможно, существует альтернатива App Designer, но я о ней не знаю.

В качестве альтернативы вы можете использовать компонент «Редактировать поле (текст)» вместо метки, которая должна автоматически переносить текст.

person R Loose    schedule 26.07.2019

Большое спасибо за ваш код, по какой-то причине он не работал в моем MATLAB 2019b, исправлено путем добавления параметра максимальной ширины текста в эту строку:

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

20 означает максимальную ширину текста 20 символов.

person Chen Ze    schedule 06.01.2020