matlab GUI slider 如何用鼠标左键点击后直接滑到点击的位置? 5

现在遇到的问题是鼠标左键点击后只滑动一个固定的距离,不会直接滑动到想要的地方,求解决方法.h_slider_scorebar=uicomponent('style','s... 现在遇到的问题是鼠标左键点击后只滑动一个固定的距离, 不会直接滑动到想要的地方, 求解决方法.

h_slider_scorebar = uicomponent('style','slider',-100,100,cscore,'position',...
[subw+1 2*v2+subimg_wh+1 3*subimg_wh+2*v2 bv2],...
'MajorTickSpacing',10,'MinorTickSpacing',5,'Paintlabels',1,'PaintTicks',1); % does not work???
set(h_slider_scorebar, 'MouseEnteredCallback', @slider_scorebar_enter_callback);
set(h_slider_scorebar, 'MouseWheelMovedCallback',@slider_scorebar_scroll_callback);
set(h_slider_scorebar, 'MouseReleasedCallback', @slider_scorebar_release_callback);
set(h_slider_scorebar, 'MouseClickedCallback', @slider_scorebar_click_callback);
set(h_slider_scorebar, 'MousePressedCallback', @slider_scorebar_press_callback);
set(h_slider_scorebar, 'MouseMovedCallback', @slider_scorebar_move_callback);
set(h_slider_scorebar, 'KeyPressedCallback',@sliderCallback);
展开
 我来答
tianxiawulang
2015-09-20 · TA获得超过2.7万个赞
知道大有可为答主
回答量:4732
采纳率:89%
帮助的人:2635万
展开全部

我没系统学习过Jave Swing的相关知识,基本上靠摸索出来的一点经验,供参考。
1、可以通过编写MouseClickedCallback回调函数实现所需功能。其它或许还有更好的做法,但就我目前所知,可能MouseClickedCallback是比较合适的,因MousePressedCallback和MouseReleasedCallback也可能会和拖动滚动条操作冲突。


2、需要获取点击鼠标时的位置,这可以通过MouseClickedCallbackData数据获取。该数据中有相对控件的位置和绝对位置,我采用的做法是通过匹配MOUSE_CLICKED后面括号中的内容提取数据。数据为double类型,需首先转换为字符串进行匹配。


3、确定鼠标在滚动条中所对应的数据,有三点需要特别注意:
(1)滚动条的方向:由Orientation确定,0为横向(默认),1为纵向。
(2)边距:貌似横向和纵向不同,分别为15和10(不知是否有某属性可以获取该值)。
(3)垂直滚动条的数据是从下向上的,但鼠标位置则以上面为基准位置,需要进行一个简单的变换。


4、目前的局限:
(1)未区分鼠标的左键和右键。
(2)未考虑滚动条采用其它单位时的处理。
(3)就目前所实现的而言,可以看到有一个先滑动固定距离,然后再到达指定位置的过程,想不出有什么办法可以克服。


5、补充:
(1)点击位置在滚动条范围内时直接到达该位置,如果在两端点击,则仍按照滚动固定距离处理,这是有意为之;
(2)可以使用MouseReleasedCallback回调函数代替MouseClickedCallback,效果似乎没
有差别(注意获取数据的细节有些差别)。

 

参考代码:

function slider_scorebar_click_callback(varargin)

d = get(gcbo);
m = char(d.MouseClickedCallbackData);
p = 'MOUSE_CLICKED,(';
m = char(d.MouseClickedCallbackData);
inx = strfind(m,p);
m = m(inx+length(p):end);
inx = strfind(m,')');
pos = str2num(m(1:inx(1)-1));
if ~d.Orientation   % 横向
    s = d.Width;
    p = pos(1);
    offset = 15;
else                % 纵向
    s = d.Height;
    p = s - pos(2);
    offset = 10;
end
if p >= offset && p <= s-offset
    mx = d.Maximum;
    mn = d.Minimum;
    v=mn+(p-offset)/(s-2*offset)*(mx-mn);
    set(gcbo,'value',v);
end

 

如果使用MouseReleasedCallback回调函数,参考代码为:

function slider_scorebar_release_callback(varargin)
d = get(gcbo);
m = char(d.MouseReleasedCallbackData);
p = 'MOUSE_RELEASED,(';
inx = strfind(m,p);
m = m(inx+length(p):end);
inx = strfind(m,')');
pos = str2num(m(1:inx(1)-1));
if ~d.Orientation   % 横向
    s = d.Width;
    p = pos(1);
    offset = 15;
else                % 纵向
    s = d.Height;
    p = s - pos(2);
    offset = 10;
end
if p >= offset && p <= s-offset
    mx = d.Maximum;
    mn = d.Minimum;
    v=mn+(p-offset)/(s-2*offset)*(mx-mn);
    set(gcbo,'value',v);
end
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式