1

I am trying to make a Matlab GUI that has a panel with scrolling content inside of a larger figure. I am having a problem hiding the overflow content when it scrolls out of the subpanel.

I got the code for the scrollbar from this SO post: Adding scroll bar in subplots within GUI

Try the code below. I have a figure, an outer panel (smaller than the figure, child to the figure), a scrolling panel (with a height greater than the figure, child to outer panel), a scroll bar, and a text field to appear in the scrolling pane (child to the scrolling panel).

When you try the code you will see the text string, which is just the alphabet repeated, scrolls up and down the whole length of the figure, but the scrolling panel stops at the edge of the limits of the outer panel.

How can I correct this problem. Thanks.

function guitest
    scrsz = get(0,'ScreenSize');

    height = scrsz(4)*7/8;
    width = scrsz(3)*2/3;
    leftmargin = 10;
    rightmargin = 10;

    % figure 
    handles.hFig = figure('Visible','on',...
                    'Position', [scrsz(3)/8 scrsz(4)/10 width height],...
                'Name', 'Tap Toolbar Report',...
                'NumberTitle', 'off',...
                'Color', [0.75 0.75 0.75],...
                'ToolBar','none',...
                'MenuBar','none',...
                'Resize','off');

    % subpanel in the figure for scrolling
    handles.hOut = uipanel('Parent',handles.hFig,...
                  'BackgroundColor', [0.85 0.85 0.85],...
                  'BorderWidth', 0,...
                  'Units', 'pixels',...
                  'Position',[leftmargin 100 width-2*leftmargin height-200]);

    hPanheight = 2000;

    handles.hPan = uipanel('Parent',handles.hOut,...
              'BackgroundColor', [0.85 0.85 0.85],...
              'BorderWidth', 0,...
              'Units', 'pixels',...
              'Position',[0 0 width-2*leftmargin-19 hPanheight]);

    str = sprintf('a\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\no\np\nq\nr\ns\nt\nu\nv\nx\ny\nz\na\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\no\np\nq\nr\ns\nt\nu\nv\nx\ny\nz\na\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\no\np\nq\nr\ns\nt\nu\nv\nx\ny\nz\na\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\no\np\nq\nr\ns\nt\nu\nv\nx\ny\nz\na\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\no\np\nq\nr\ns\nt\nu\nv\nx\ny\nz\na\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\no\np\nq\nr\ns\nt\nu\nv\nx\ny\nz\na\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\no\np\nq\nr\ns\nt\nu\nv\nx\ny\nz\na\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\no\np\nq\nr\ns\nt\nu\nv\nx\ny\nz');
    uicontrol('Parent', handles.hPan,'Style','text','String',str,'FontSize', 10,'FontWeight','bold', 'HorizontalAlignment', 'left',...
            'Position',[10 20 20 1960],'BackgroundColor', [0.85 0.85 0.85]);          

    handles.hSld = uicontrol('Style', 'slider',...
                'BackgroundColor', [0.8 0.8 0.8], ...
                'Position', [width-leftmargin-20 101 19 height-202],...
                'Callback', {@onSlide,handles.hPan,handles.hOut});
    set(handles.hSld,'Value',1);
    onSlide(handles.hSld,'',handles.hPan,handles.hOut)
end 

function onSlide(hSld,~,hPan,hOut)
    %# slider value
    offset = get(hSld,'Value');

    %# update panel position
    p = get(hPan, 'Position');  %# panel current position
    ph = get(hOut, 'Position');
    set(hPan, 'Position',[p(1) -offset*(p(4)-ph(4)) p(3) p(4)])
end
Community
  • 1
  • 1
sequoia
  • 3,025
  • 8
  • 33
  • 41

1 Answers1

1

I would use a container object that has scroll capability built-in. Take a look at:

help uitable
help uitree
siliconwafer
  • 732
  • 4
  • 9
  • thanks for you suggestions. I looked into those objects and have been to use them more in my GUIs, but the real solution was just to keep it simple. I altered the design so it is less complex. Thanks though. – sequoia Feb 16 '12 at 18:20