Форум программистов, компьютерный форум, киберфорум
Наши страницы
letete
Войти
Регистрация
Восстановить пароль
Несколько сообщений о МАТЛАБ и о том, как им пользоваться.

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

Изменение цветов командного окна MATLAB

Запись от letete размещена 23.06.2014 в 17:25
Обновил(-а) letete 15.08.2014 в 18:21

Подборка статей г-на Альтмана
на тему разукрашивания командного окна МАТЛАБ.
Перевод вольный, сохраняющий лишь суть проблемы,
опробованный и дополненный.

Отсылка к оригиналам:
original part 1,
original part 2,
original part 3.

Часть 1.
Изменение цветов (фона и шрифта) в командном окне МАТЛАБ возможно из меню File->Preferences, но, очевидно, требует действий пользователя. Представляет интерес другой вопрос: можно ли делать это программно (например, записать нужную последовательность команд в некоторый скрипт-файл "startup.m"). Такое может понадобиться, например, при работе над двумя приложениями одновременно (МАТЛАБ запущен дважды), когда хотелось бы визуально отличать вывод одного от другого.

Программное изменение командного окна может быть сделано двумя способами: внести изменения в системные настройки (здесь ссылку добавлю позже) или задать настройки для текущей сессии. Собственно, по поводу цветов:
Matlab M
1
2
3
4
5
6
% Не использовать системные цвета
com.mathworks.services.Prefs.setBooleanPref('ColorsUseSystem',0);
 
% Использовать заданные цвета для background (вместо черного на белом по умолчанию)
com.mathworks.services.Prefs.setColorPref('ColorsBackground',java.awt.Color.yellow);
com.mathworks.services.ColorPrefs.notifyColorListeners('ColorsBackground');
и аналогично для цвета текста, который называется 'ColorsText'. Обратите внимание, что цвета могут быть заданы несколькими альтернативными способами (см. ниже).

Это повлияет на все текстовые панели МАТЛАБ (командное окно – Command window, окно истории – Command History, обозреватель рабочей области – Workspace и т.д.) сразу и на все будущие сессии МАТЛАБ. Если же Вы хотите установить цвета только в командном окне и больше нигде, или хотите изменить лишь текущую сессию, то забудьте про способ изменения настроек. Вместо этого используйте следующий короткий фрагмент кода (возможно, потребуется настроить его для конкретных версий МАТЛАБ).
Matlab M
1
2
3
cmdWinDoc = com.mathworks.mde.cmdwin.CmdWinDocument.getInstance;
listeners = cmdWinDoc.getDocumentListeners;
jTextArea = listeners(3);
(Для тех, кто Java-подкованный, это свинг JTextArea.)
Замечание: безопаснее было бы пройтись по массиву listeners, т.к. нет уверенности, что в вашей версии jTextArea будет находиться на третьем месте в массиве.

Не по теме:

<! не актуально>
Дополнение: у меня, например, эта штука находится на 4 месте в массиве (MATLAB R2012a). Предлагаю следующую схему извлечения нужного элемента:

Matlab M
1
2
3
4
5
for k=1:size(listeners,1)
    if ~isempty(strfind(get(listeners(k), 'Type'), 'JTextArea'))
        jTextArea = listeners(k); break
    end
end
Конструкция get(listeners(k), 'Type') вызывает предупреждение. Можно либо отключить предупреждения, либо пережить, либо рассказать мне, что можно сделать в этой ситуации.


В версии МАТЛАБ 2014а предложенная конструкция уже не сработает (тупо не доступно поле 'Type'), однако всегда можно найти альтернативное решение проблемы! В МАТЛАБ 2014а jTextArea находится уже на пятом месте (во всяком случае, у меня) и вот еще один не хитрый способ выделить нужный элемент из массива:
Matlab M
1
2
3
4
5
6
for k=1:size(listeners,1)                   % основан на том, что
    try get(listeners(k), 'AccessibleName') % только у JTextArea
        jTextArea = listeners(k); break     % есть поле AccessibleName
    catch, continue                         % а значит для остальных 
    end                                     % нужно просто проигнорировать
end                                         % ошибку
Теперь Вы можете легко установить цвета (применяются немедленно), используя несколько альтернативных путей:
Matlab M
1
2
3
4
jTextArea.setBackground(java.awt.Color.yellow);
jTextArea.setBackground(java.awt.Color(1,1,0));
set(jTextArea,'Background','yellow');
set(jTextArea,'Background',[1,1,0]);
Можете сделать то же самое со свойством 'Foreground'.

Часть 2.
Такой вопрос: а можно ли для команд dist или fprintf установить конкретные цвета вывода на раз?

Короткий и простой ответ: нет. Вы можете изменить цвет текста, как описано выше, но как только Вы это сделаете, весь текст командного окна будет изменен соответствующим образом.

К сожалению, командное окно (т.к. является стандартным экземпляром свинга JTextArea) автоматически не поддерживает HTML-форматирование, как большинство элементов управления (см. использование HTML-форматирования). В действительности, командное окно есть объект Document, который хранит весь текст (вместе с информацией о стиле шрифта); он является расширением свинга javax.swing.text.PlainDocument, который не позволяет какого-либо форматирования текста. Да и сам объект «командное окно» является всего лишь простым JTextArea, который не позволяет использовать стилизированные объекты Document. Возможно, в будущих версиях MathWorks могут включить практически идентичный JTextPane, который поддерживает стилизированный текст.

В очень ограниченной степени, Вы можете использовать тот факт, что гиперссылки и сообщения об ошибках имеют отличные от стандартного стили (соответственно, синий подчеркнутый и красный). Таким образом, Вы можете выводить в этих стилях:
Matlab M
1
2
% Использование гиперссылки
>> disp('<a href="">my text</a>')
my text
Matlab M
1
2
% Использование стандартного потока ошибок STDERR (fid=2):
>> fprintf(2,'my text\n')
my text
Примечание. Можно получить хэндл JTextArea (см. Displaying hidden handle properties - тоже расскажу об этом когда время найдется) и установить его свойство UI на свой специально созданный UI-класс. В этом классе можно установить свойства текста посегментно так, как Вы хотите. Это, по-видимому, то, как МАТЛАБ преодолел ограничения JTextPane: они реализовали пользовательский класс com.mathworks.mde.cmdwin.CmdWinSyntaxUI, который расширяет javax.swing.plaf.basic.BasicTextAreaUI. Но реализация такого класса для пользовательского интерфейса, сохраняя при этом функциональность подсветки синтаксиса МАТЛАБ, скорее всего, довольно сложна и не стоит усилий. Так что мы можем лишь ожидать некоторого метода, который бы в будущем выпуске МАТЛАБ поддерживал бы подобного рода функции.

Часть 3 (cprintf – отображение текста с цветовым форматированием).
После долгих мучений и мытарств мне (Yair Altman) удалось справиться с проблемой цветного вывода в командное окно. Результатом стала функция cprintf, которую можно скачать с портала MATLAB Central File Exchange.
(Дополнение. Этот файл проще всего сохранить в одну из стандартных директорий МАТЛАБ, для того чтобы система воспринимала функцию cprintf как одну из встроенных. Воспользуйтесь командой path: увидите список стандартных директорий, среди которых есть что-то вроде C:\Users\<UserName>\Documents\MATLAB - я обычно все такое сохраняю сюда.)
Для начала, вот результат:
Нажмите на изображение для увеличения
Название: cprintf.png
Просмотров: 505
Размер:	11.7 Кб
ID:	2538
cprintf опирается на идеи, описанные в предыдущих частях. Поскольку командное окно является JTextArea, что не позволяет задавать стиль посегментно, крайне любопытно понять, как МАТЛАБ способен отображать подсветку синтаксиса в нем. Вероятно, так сделано с помощью выделенного класса UI (com.mathworks.mde.cmdwin.CmdWinSyntaxUI), как было предположено во второй части. Это внутренний класс Matlab Java, поэтому мы не можем изменить его. Казалось бы, что это тупик! Но лишь на некоторое время...
(продолжение следует!)
Размещено в МАТЛАБ
Просмотров 2058 Комментарии 0
Всего комментариев 0
Комментарии
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru