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

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

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

Запись от letete размещена 23.06.2014 в 17:25
Показов 14700 Комментарии 0

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

Отсылка к оригиналам:
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
Просмотров: 1185
Размер:	11.7 Кб
ID:	2538
cprintf опирается на идеи, описанные в предыдущих частях. Поскольку командное окно является JTextArea, что не позволяет задавать стиль посегментно, крайне любопытно понять, как МАТЛАБ способен отображать подсветку синтаксиса в нем. Вероятно, так сделано с помощью выделенного класса UI (com.mathworks.mde.cmdwin.CmdWinSyntaxUI ), как было предположено во второй части. Это внутренний класс Matlab Java, поэтому мы не можем изменить его. Казалось бы, что это тупик! Но лишь на некоторое время...
(продолжение следует!)
Размещено в МАТЛАБ
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 0
Комментарии
 
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru