2009-06-08 2 views
3

Моя проблема заключается в следующем: у меня есть графический интерфейс MATLAB, и я хочу получить аналитические результаты, если я запустил его для отображения в моем графическом интерфейсе, а не в командном окне. Я попытался использовать список для отображения результатов из-за ползунков, которые автоматически создаются для списка, но это не сработало. Как я могу отображать данные, возможно, используя статическое текстовое поле?Отображение аналитических результатов в графическом интерфейсе MATLAB

ответ

1

Обычно я использую фигуру и текст в ней, например.

figure(gcf) 
text(offsetX1, offsetX1, ['result 1: ' num2str(result1)]) 
text(offsetX2, offsetX2, ['result 2: ' num2str(result2)]) 

в настоящее время я уверен, что есть лучший способ, но он работает хорошо для меня, , даже если вы должны проектировать детали макета вручную.

8

Во-первых, вам необходимо убедиться, что вы подавляете любой вывод в командном окне. Вы можете сделать это, убедившись, что вы закончите строки с semicolon, не используйте функцию DISP для отображения данных и не используйте функцию FPRINTF для отправки данных на стандартный вывод (то есть в командное окно).

Во-вторых, определите, какие «результаты» вы хотите отобразить. Если это вектор или матрица числовых значений, вы можете использовать объект UITABLE вместо статического текстового поля (как предлагается в Azim's answer to your other question и при условии, что у вас есть одна из новых версий MATLAB). Если это всего лишь несколько числовых значений, символов или строк, я бы предложил использовать статическое текстовое поле. Например:

hList = uicontrol('Style','text','Position',[100 100 200 200]); 
set(hList,'String',{'Line 1'; 'Line 2'}); % Displays 2 lines, one string each 
vec = rand(3,1); % Column array of 3 random values 
set(hList,'String',num2str(vec)); % Displays 3 lines, one number per line 

С помощью этой опции, вы, вероятно, в конечном итоге делает много с string operations.

ПРИМЕЧАНИЕ: Со статическими текстовыми полями, если вы помещаете в них больше текста, чем они могут отображать, они просто отсекут текст. Они автоматически не создают ползунки для просмотра всего фрагмента текста. Вам нужно либо сделать статическое текстовое поле больше, отрегулируйте "FontSize" property статического текстового поля на меньшее значение, либо (более сложный вариант) создайте свой собственный слайдер, который будет настраивать то, что отображается в текстовом поле.


EDIT: более сложный вариант ...

В случае, если кто-то интересно, я думал, что включают в себя некоторые примеры кода для создания статического текстового поля с помощью ползунка, который контролирует содержимое отображается в текстовом поле. Существует несколько разных способов сделать это, начиная с простейшей реализации, которую я могу представить (приведенной ниже) на более сложные версии, используя nested functions и fancy OOP stuff.

Во-первых, вы будете иметь сохраненные как м-файлов две следующие функции:

callback_scrolltext.m

function callback_scrolltext(source,event,hText) 
    textString = get(hText,'UserData'); 
    nLines = numel(textString); 
    lineIndex = nLines-round(get(source,'Value')); 
    set(hText,'String',textString(lineIndex:nLines)); 
end 

update_scrolltext.m

function update_scrolltext(newText,hText,hSlider) 
    newText = textwrap(hText,newText); 
    set(hText,'String',newText,'UserData',newText); 
    nRows = numel(newText); 
    if (nRows < 2), 
    sliderEnable = 'off'; 
    else 
    sliderEnable = 'on'; 
    end 
    nRows = max(nRows-1,1); 
    set(hSlider,'Enable',sliderEnable,'Max',nRows,... 
     'SliderStep',[1 3]./nRows,'Value',nRows); 
end 

Второй , создайте объекты GUI со следующим кодом.Вы можете установить свойства «Position» все, что вы хотите, а также использовать любую ручку для фигуры или панели объекта вместо hParent:

hParent = figure; 
hText = uicontrol('Style','text',... 
        'Parent',hParent,... 
        'Units','pixels',... 
        'Position',[100 100 100 40]); 
hSlider = uicontrol('Style','slider',... 
        'Parent',hParent,... 
        'Units','pixels',... 
        'Position',[200 100 10 40],... 
        'Enable','off',... 
        'Callback',{@callback_scrolltext,hText}); 

Наконец, каждый раз, когда вы хотите изменить текст текстовое поле, вызовите update_scrolltext с текстом, который вы хотите отобразить (содержится в массиве ячеек, точно так же, как ввод строки в TEXTWRAP) и ручками текстового поля и слайдера. Вот несколько примеров:

update_scrolltext({'hello'},hText,hSlider); 
update_scrolltext({'hello'; 'there'; 'silly'; 'world'},hText,hSlider); 

Изменить код по своему усмотрению и наслаждаться! =)

+0

Можете ли вы предложить, как предотвратить исчезновение предыдущего введенного текста при каждом новом вызове 'update_scrolltext()'? Другими словами, как я могу изменить приведенный выше код, чтобы показать новый текст в новой строке с предварительными текстами над ним? Благодарю. – Pupil

+1

@Pupil Добавьте это в начало 'update_scrolltext' и он должен добавить вместо перезаписывания:' oldText = get (hText, 'UserData'); newText = [oldText; newText]; ' – gnovice

+0

Большое спасибо gnovice! – Pupil

2

Я использую listbox для отображения вывода команды просто отлично. Я нахожу, что полосы прокрутки облегчают просмотр вывода без помех.

Предполагаемый статус - это ручка uicontrol со стилем listbox;

Для этого, я думаю, исходная строка uicontrol должна быть ячейкой, а не строкой. Вы можете убедиться в этом, сделав строку в UIControl как «Ready» на двух линиях, или вы можете заставить строку в ячейке, как это:

set(status,'String', [message; {get(status,'String')}]); 
+0

спасибо всем, ребята, я попробую. – 2009-06-17 17:34:22

+0

еще одна вещь, если вы обновляете GUI во время работы кода, изменения могут быть не сразу видны. Используйте «втянуть» в этом случае, чтобы принудительно выполнить перерисовку графического интерфейса. – ustun

0

Я только начиная с на Matlab ГИП, поэтому я ни в коем случае не специалист или даже опытный, но кто-то упомянул в другом форуме, что элемент edit-text автоматически генерирует полосы прокрутки? У этого также есть дополнительное преимущество, которое я могу выбрать и копировать. Я собираюсь выяснить, могу ли я выяснить свой код. Я отправлю обратно, когда узнаю.

+1

Это правда. Я также использую «edit» uicontrols, когда мне нужны полосы прокрутки и выбираемый текст. – tashuhka

Смежные вопросы