Tuesday 15 March 2011

java - JRootpane - setting glasspane to visible doesnt intercept mouse events -



java - JRootpane - setting glasspane to visible doesnt intercept mouse events -

i have jframe , jpanel hierarchy within it, want implement inner panel can create "disabled"(while other panels dont change), is, cover semi transparent grayness layer , intercept mouse , perhaps keyboard events dispatched panel. ive been searching solution , didnt find 1 yet.

the closest got solution when used jrootpane, whenever want disabled create glasspane visible. glasspane had been set opaque , semi transparent background.

a simple illustration of effort :

public class test extends jframe { private final jpanel jpanel; public test() { jpanel = new jpanel(); final jbutton jbutton = new jbutton("hidden"); jbutton.addactionlistener(new actionlistener() { @override public void actionperformed(actionevent e) { system.out.println("hidden clicked!"); } }); final jrootpane jrootpane = new jrootpane(); jpanel.add(jrootpane); final jpanel glasspane = new jpanel(); final jbutton jbutton2 = new jbutton(); jbutton2.addactionlistener(new actionlistener() { private boolean visible = true; @override public void actionperformed(actionevent e) { glasspane.setvisible(visible = !visible); } }); jpanel.add(jbutton2); jrootpane.getcontentpane().add(new jscrollpane(jbutton)); glasspane.setbackground(new color(0.5f, 0.5f, 0.5f, 0.2f)); glasspane.setopaque(true); jrootpane.setglasspane(glasspane); glasspane.setvisible(true); getcontentpane().add(jpanel); } public static void main(string[] strings) { final test test = new test(); test.pack(); test.setvisible(true); } }

but problem when glass visible on top of content, doesnt intercepts events getting content should, documented here.

in test class glasspane doesn't intercept events, because didn't tell intercept events (intercepting events not default behavior).

in documentation link, says

the glass pane

the glass pane useful when want able grab events or paint on area contains 1 or more components. example, you can deactivate mouse events multi-component part by having glass pane intercept events. or can display image on multiple components using glass pane.

you can intercept mouse events way:

glasspane.addmouselistener(new mouseadapter() { @override public void mouseclicked(mouseevent e) { e.consume(); } @override public void mousepressed(mouseevent e) { e.consume(); } });

you can intercept keyboard events way:

glasspane.setfocusable(true); glasspane.addkeylistener(new keylistener() { @override public void keytyped(keyevent e) { e.consume(); } @override public void keyreleased(keyevent e) { e.consume(); } @override public void keypressed(keyevent e) { e.consume(); } });

note: jpanel has focasable intercept keyboard events.

java swing glasspane

No comments:

Post a Comment