Добавление полосы прокрутки в подзаголовки в графическом интерфейсе

Как добавить прокрутку в подзаголовки?

Я прошел много учебников, но они кажутся довольно трудными для понимания (например, демонстрационный пример прокрутки )

Любой более простой способ реализовать?


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

function readfile while(1) q = cell(16,2); q{1,1}='1B000003AC63A328.txt'; % sensor 1 q{1,2} = 'sensor 1'; q{2,1}='D6000003ACA0AB28.txt';% sensor 2 q{2,2} = 'sensor 2'; q{3,1}='B0000003AC9B8428.txt'; % sensor 3 q{3,2} = 'sensor 3'; q{4,1}='5D000003AC5FEA28.txt';% sensor 4 q{4,2} = 'sensor 4'; q{5,1}='E1000003AC5DA728.txt';% sensor 5 q{5,2} = 'sensor 5'; q{6,1}='BE000003ACA4F828.txt';% sensor 6 q{6,2} = 'sensor 6'; q{7,1}='5F000003AC8C6128.txt';% sensor 7 q{7,2} = 'sensor 7'; q{8,1}='78000003AC77A328.txt'; q{8,2} = 'sensor 8'; % sensor 8 q{9,1}='B2000003AC542A28.txt';% sensor 9 q{9,2} = 'sensor 9'; q{10,1}='EB000003B717F328.txt';% sensor 10 q{10,2} = 'sensor 10'; q{11,1}='86000003AC97AC28.txt';% sensor 11 q{11,2} = 'sensor 11'; q{12,1}='78000003AC748828.txt';% sensor 12 q{12,2} = 'sensor 12'; q{13,1}='A5000003AC905C28.txt';% sensor 20 q{13,2} = 'sensor 20'; q{14,1}='B4000003ACA4A728.txt';% sensor 21 q{14,2} = 'sensor 21'; q{15,1}='14000003AC69A528.txt';% sensor 22 q{15,2} = 'sensor 22'; q{16,1}='99000003AC68F728.txt';% sensor 23 q{16,2} = 'sensor 23'; for j=1:16 fname=q{j}; fid=fopen(fname,'r'); header=fgetl(fid); data=textscan(fid,'%s','delimiter',';'); fclose(fid); data=data{:}; day=data(1:3:end); hour=data(2:3:end); temp=str2double(data(3:3:end)); time=cellfun(@(x) sprintf('%s %s',day{strcmpi(hour,x)},x),hour,'uniformoutput',0); % timev=datevec(time,'mm.dd.yyyy HH:MM:SS'); timen=datenum(time,'mm.dd.yyyy HH:MM:SS'); seconds=timen*86400/60; figure(1) subplot(5,4,j), h=plot(seconds-seconds(1),temp,'YDataSource','temp'); legend(h,q{j,2}); grid on xlabel('Time(mins)'); ylabel('Temp °C'); %subplot(1,1,i), figure(2) if(j==1) r=plot(seconds-seconds(1),temp); hold on set(r,'Color','blue','LineWidth',2) end if(j==2) r=plot(seconds-seconds(1),temp); set(r,'Color','green','LineWidth',2) end if(j==3) r=plot(seconds-seconds(1),temp); set(r,'Color','red','LineWidth',2) end if(j==4) r=plot(seconds-seconds(1),temp); set(r,'Color','cyan','LineWidth',2) end if(j==5) r=plot(seconds-seconds(1),temp); set(r,'Color','magenta','LineWidth',2) end if(j==6) r=plot(seconds-seconds(1),temp); set(r,'Color','yellow','LineWidth',2) end if(j==7) r=plot(seconds-seconds(1),temp); set(r,'Color','black','LineWidth',2) end if(j==8) r=plot(seconds-seconds(1),temp,'--'); set(r,'Color','blue','LineWidth',2) end if(j==9) r=plot(seconds-seconds(1),temp,'--'); set(r,'color','green','LineWidth',2) end if(j==10) r=plot(seconds-seconds(1),temp,'--'); set(r,'Color','red','LineWidth',2) end if(j==11) r=plot(seconds-seconds(1),temp,'--'); set(r,'Color','cyan','LineWidth',2) end if(j==12) r=plot(seconds-seconds(1),temp,'--'); hold on set(r,'Color','magenta','LineWidth',2) end if(j==13) r=plot(seconds-seconds(1),temp,'--'); set(r,'Color','yellow','LineWidth',2) end if(j==14) r=plot(seconds-seconds(1),temp,'--'); set(r,'Color','black','LineWidth',2) end if(j==15) r=plot(seconds-seconds(1),temp,'-.'); set(r,'Color','blue','LineWidth',2) end if(j==16) r=plot(seconds-seconds(1),temp,'-.'); set(r,'Color','green','LineWidth',2) end legend('Sensor 1','Sensor 2','Sensor 3','Sensor 4','Sensor 5','Sensor 6',... 'Sensor 7','Sensor 8','Sensor 9','Sensor 10','Sensor 11','Sensor 12','Sensor 20','Sensor 21','Sensor 22','Sensor 23','Location','BestOutside') end pause(2*60) end end 

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

Идея состоит в том, чтобы создать большую панель внутри фигуры, которая будет содержать все подзаголовки. Панель будет больше размера в размере. Вам придется вручную расположить оси внутри этой панели. Кроме того, используя слайдер, вам нужно будет сохранить положение самой панели, чтобы контролировать, какая часть ее видна.

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

Мы начинаем с создания фигуры и размещения панели и компонентов слайдера для заполнения всей фигуры:

 %# create figure, panel, and slider w = 600; h = 500; %# width/height of figure handles.hFig = figure('Menubar','figure', 'Resize','off', ... 'Units','pixels', 'Position',[200 200 wh]); handles.hPan = uipanel('Parent',handles.hFig, ... 'Units','pixels', 'Position',[0 0 w-20 h]); handles.hSld = uicontrol('Parent',handles.hFig, ... 'Style','slider', 'Enable','off', ... 'Units','pixels', 'Position',[w-20 0 20 h], ... 'Min',0-eps, 'Max',0, 'Value',0, ... 'Callback',{@onSlide,handles.hPan}); 

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

Затем мы создадим новые оси по одному, заставляя каждую заполнять одну страницу просмотра. Я поместил этот код в отдельную функцию addAxis для удобства использования. Сначала позвольте мне показать, как мы называем эту функцию:

 %# add and plot to axes one-by-one hAx = zeros(7,1); clr = lines(7); for i=1:7 hAx(i) = addAxis(handles); plot(hAx(i), cumsum(rand(100,1)-0.5), 'LineWidth',2, 'Color',clr(i,:)) title(hAx(i), sprintf('plot %d',i)) pause(1) %# slow down so that we can see the updates end 

addAxis просто увеличивает размер панели контейнера, создает ось, позиционирует ее сверху, настраивает ползунки, а затем возвращает дескриптор вновь созданной оси.

 function hAx = addAxis(handles) %# look for previous axes ax = findobj(handles.hPan, 'type','axes'); if isempty(ax) %# create first axis hAx = axes('Parent',handles.hPan, ... 'Units','normalized', 'Position',[0.13 0.11 0.775 0.815]); set(hAx, 'Units','pixels'); else %# get height of figure p = get(handles.hFig, 'Position'); h = p(4); %# increase panel height, and shift it to show new space p = get(handles.hPan, 'Position'); set(handles.hPan, 'Position',[p(1) p(2)-hp(3) p(4)+h]) %# compute position of new axis: append on top (y-shifted) p = get(ax, 'Position'); if iscell(p), p = cell2mat(p); end p = [p(1,1) max(p(:,2))+hp(1,3) p(1,4)]; %# create the new axis hAx = axes('Parent',handles.hPan, ... 'Units','pixels', 'Position',p); %# adjust slider, and call its callback function mx = get(handles.hSld, 'Max'); set(handles.hSld, 'Max',mx+h, 'Min',0, 'Enable','on') %#set(handles.hSld, 'Value',mx+h) %# scroll to new space hgfeval(get(handles.hSld,'Callback'), handles.hSld, []); end %# force GUI update drawnow end 

Функция обратного вызова слайдера просто сдвигает панель вверх и вниз в соответствии с текущим значением ползунка:

 function onSlide(hSld,ev,hPan) %# slider value offset = get(hSld,'Value'); %# update panel position p = get(hPan, 'Position'); %# panel current position set(hPan, 'Position',[p(1) -offset p(3) p(4)]) end 

Результат этого примера:

Скриншот

  • Как отобразить более трех уровней расширяемого вида списка?
  • Как я могу складывать / накладывать jPanels в Java?
  • Как получить экземпляр fragmentа из FragmentActivity?
  • Что такое MVP и MVC и в чем разница?
  • Сделать приложение-волшебник на Android-устройстве
  • Применение MVC с помощью JavaFx
  • Один или несколько ресурсов имеют цель «голова», но не «головной» компонент был определен в представлении
  • Дизайн пользовательского интерфейса Blackberry - настраиваемый пользовательский интерфейс?
  • ProgressBar в Javafx не обновляется в блоке onAction
  • Qt сигнализирует по streamам, один - stream GUI?
  • JButton ActionListener - обновление GUI только после нажатия JButton
  • Давайте будем гением компьютера.