java - How do you add a mouseListener to a jscrollbar? -
i have mouseentered , mouseexited events cause jpanel content change changes size of jpanel. upon mouseentered, content grows , scrollable. upon mouseexited, content shrinks , not scrollable.
the problem hovering mouse on scrollbar triggers mouseexited event jpanel, when user wants drag scrollbar's knob, disappears when go click on it.
if add mouselistener scrollbar itself, imagine keep content shrinking. i've never added mouselistener scrollbar. how can trigger event on mouseentered/exited on scrollbar?
yes, can attach mouselistener scrollbar. it's necessary when content changes on mouseentered/mouseexited wrt jpanel because hovering on jpanel's scrollbar triggers mouseexited. must implement 2 aspects in order keep content if hovered on jpanel: mouseentered/mouseexited , mouseclicked/mousereleased. reason because mouse can hover off scrollbar when scrollbar's knob being dragged, , don't want content change mid-scroll.
all need is, add listener directly scrollbar:
myscrollbar.addmouselistener(new mouseadapter() { @override public void mouseentered(mouseevent e) { if(overscrollofftimer != null) { overscrollofftimer.stop(); overscrollofftimer = null; } mymodel.setoverscrollbar(true); } @override public void mouseexited(mouseevent e) { if(overscrollofftimer == null) { overscrollofftimer = new timer(250, overscrollofflistener); overscrollofftimer.start(); } } @override public void mousepressed(mouseevent e) { if(activescrollofftimer != null) { activescrollofftimer.stop(); activescrollofftimer = null; } mymodel.setbeingscrolled(true); } @override public void mousereleased(mouseevent e) { if(activescrollofftimer == null) { activescrollofftimer = new timer(250, activescrollofflistener); activescrollofftimer.start(); } } });
in mouselistener, added 2 timers initiated change of jpanel content (after 250ms) (plus third timer jpanel hover). without timers, content can visually hiccup hover panel scrollbar or back. 1 timer started on mouseexited scrollbar. other started when mousereleased scrollbar knob. kept track of whether either mouse on scrollbar, moving scrollbar, , whether mouse on jpanel. if of things true, displayed large content. otherwise, if false, draw small content.
here example of timers:
private javax.swing.timer overscrollofftimer; actionlistener overscrollofflistener = new actionlistener() { @override public void actionperformed(actionevent evt) { if(evt.getsource() == overscrollofftimer) { /* stop timer */ overscrollofftimer.stop(); overscrollofftimer = null; mymodel.setoverscrollbar(false); mymodel.notifyobservers(); revalidate(); repaint(); } } }; private javax.swing.timer activescrollofftimer; actionlistener activescrollofflistener = new actionlistener() { @override public void actionperformed(actionevent evt) { if (evt.getsource() == activescrollofftimer) { /* stop timer */ activescrollofftimer.stop(); activescrollofftimer = null; mymodel.setbeingscrolled(false); mymodel.notifyobservers(); revalidate(); repaint(); } } };
i have not included timer or mouse listener jpanel, it's similar endeavor without clicked/released methods.
note, tracked status of hover , scrolling in model because other jpanels display different content based on hover interaction , have access model.
btw, used terms "offtimer", "offlistener", etc. because i'm showing real content on hover on set of panels. hovering off of these panels causes content disappear. reason want content disappear because content changes hover on , don't want user confused static unmoving content , lead them make incorrect visual conclusions (e.g. associate visually aligned data in 2 panels alignment changes based on hover position).
Comments
Post a Comment