#user-interface #matlab #calendar #datepicker
#пользовательский интерфейс #matlab #Календарь #выбор даты
Вопрос:
Кто-нибудь знает способ отображения всплывающего календаря выбора даты в графическом интерфейсе MATLAB? Я знаю, что у финансового инструментария есть uicalendar
функция, но, к сожалению, у меня нет этого инструментария.
У меня есть предчувствие, что мне придется использовать для этого Java или какой-то другой язык, о котором я ничего не знаю.
Я ищу что-то похожее на это:
(источник: welie.com)
который возвращал бы строку даты после того, как пользователь выберет дату.
Комментарии:
1. Спасибо за все ответы! Я решу, какой из них принять, когда приступлю к тестированию различных подходов.
Ответ №1:
Вот два подхода, которые позволят вам создать профессионально выглядящий компонент календаря в Matlab без особых усилий по программированию:
-
Используйте компонент календаря на Java (например, один из этих или эти). После загрузки соответствующего Java-класса или Jar-файла добавьте его в свой статический Java classpath (используйте
edit('classpath.txt')
команду из командной строки Matlab). Наконец, используйте встроенную функцию javacomponent, чтобы поместить компонент в окно Matlab figure. -
Если вы используете ОС Windows, вы можете встроить любой доступный элемент управления календарем Active-X. Используйте встроенную функцию actxcontrolselect, чтобы выбрать свой любимый элемент управления календарем (например, «Calendar Control 11.0» от Microsoft Office — MSCAL.Calendar.7 — который автоматически устанавливается с Office 2003; или «Microsoft Date and Time Picker Control 6.0» — MSComCtl2.DTPicker.2, или …). Затем используйте функцию actxcontrol, чтобы поместить компонент в окно Matlab figure.
-
Matlab имеет несколько довольно полезных встроенных элементов управления календарем (выбором даты) — сегодня я опубликовал статью о них
Комментарии:
1. @Yair Altman: Javacomponent, похоже, недокументирован. Будучи совершенно незнакомым с использованием java в MATLAB, не могли бы вы объяснить входные параметры?
Ответ №2:
К сожалению, у меня не так много времени для более полного ответа, но я бы попытался uitable
создать таблицу и определить CellSelectionCallback
, чтобы получить дату.
Вот немного, чтобы вы начали:
dates = calendar;
dates(~any(dates,2),:) = [];
fh = figure;
uh = uitable('parent',fh,'data',dates,'ColumnWidth',repmat({20},1,7),...
'ColumnName',{'S','M','T','W','T','F','S'});
Ответ №3:
Я бы начал с функции calendar(), которая выводит матрицу, содержащую календарь за любой месяц. Я полагаю, вы могли бы объединить это с интерактивным интерфейсом для получения определенной даты?
Следующий код действительно уродлив, но может помочь вам начать…
WINDOW_WIDTH = 300;
WINDOW_HEIGHT = 200;
f= figure('Position',[300 300 WINDOW_WIDTH WINDOW_HEIGHT]);
NB_ROWS = 6;
NB_COLS = 7;
width = round(WINDOW_WIDTH/NB_COLS);
height = round(WINDOW_HEIGHT/NB_ROWS);
buttons = nan(NB_ROWS,NB_COLS);
dates = calendar();
for row = 1:NB_ROWS
for col = 1:NB_COLS
if dates(row,col) == 0
mydate = '';
else
mydate = sprintf('%i', dates(row,col));
end
buttons(row,col) = uicontrol('Style', 'PushButton', ...
'String', mydate, ...
'Position', [(col-1)*width (NB_ROWS - row)*height width height]);
end
end
Комментарии:
1. Вы можете вставить
dates(all(dates==0,2),:)=[];
после вызова calendar(), чтобы исключить строку со всеми нулями.2. И
[NB_ROWS,NB_COLS] = size(dates);
3. Хорошие моменты. Сегодня я немного занят, но не стесняйтесь редактировать соответствующим образом 🙂
4. Ваше решение намного красивее, чем использование uitable, но я думаю, что с uitable будет гораздо менее сложно иметь дело.