1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200
| /**
* Projet : LAM
* Paquetage : fr.statlife.LAM.IHM
* Fichier : FixedGlassPane.java
*
* Classe permettant d'afficher le GlassPane avec une ProgressBar pour bloquer
* l'application pendant l'analyse.
* Classe recuperee sur
* http://www.java2s.com/Code/Java/Swing-JFC/Showhowaglasspanecanbeusedtoblockmouseandkeyevents.htm
*
* @author Mathilde Pellerin
* @date 18 mai 2010
*/
/*
Java Swing, 2nd Edition
By Marc Loy, Robert Eckstein, Dave Wood, James Elliott, Brian Cole
ISBN: 0-596-00408-7
Publisher: O'Reilly
*/
/*
This directory contains a fixed GlassPane example.
This fixes two bugs:
1) Key events were not supressed in the original example, they are now
2) On 1.2 and 1.3 systems, firHtmlLabelst mouse click after removing glass pane
would not be sent to the component under the mouse. This was a bug
in the way JRootPane handled the glass pane component that has been
fixed in the 1.4 release. FixedGlassPane.java (see below) provides
a workaround for 1.2 and 1.3, but is still safe to use with 1.4.
The updated files are:
SwingGlassExample.java Updated to use (and control) the new glass pane
FixedGlassPane.java Extension of JPanel that allows for redispatching
erroneous events to their rightful owners
*/
package fr.statlife.LAM.IHM;
import java.awt.Component;
import java.awt.Container;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.JMenuBar;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
//Based in part on code from the Java Tutorial for glass panes (java.sun.com).
//This version handles both mouse events and focus events. The focus is
//held on the panel so that key events are also effectively ignored. (But
//a KeyListener could still be attached by the program activating this pane.)
//
@SuppressWarnings("serial")
class FixedGlassPane extends JPanel implements MouseListener,
MouseMotionListener, FocusListener
{
// helpers for redispatch logic
Toolkit toolkit;
private JMenuBar menuBar;
private Container contentPane;
boolean inDrag = false;
// trigger for redispatching (allows external control)
boolean needToRedispatch = false;
public FixedGlassPane(JMenuBar mb, Container cp) {
toolkit = Toolkit.getDefaultToolkit();
menuBar = mb;
contentPane = cp;
addMouseListener(this);
addMouseMotionListener(this);
addFocusListener(this);
}
public void setVisible(boolean v) {
// Make sure we grab the focus so that key events don't go astray.
if (v)
requestFocus();
super.setVisible(v);
}
// Once we have focus, keep it if we're visible
public void focusLost(FocusEvent fe) {
if (isVisible())
requestFocus();
}
public void focusGained(FocusEvent fe) {
}
// We only need to redispatch if we're not visible, but having full control
// over this might prove handy.
public void setNeedToRedispatch(boolean need) {
needToRedispatch = need;
}
/*
* (Based on code from the Java Tutorial) We must forward at least the mouse
* drags that started with mouse presses over the check box. Otherwise, when
* the user presses the check box then drags off, the check box isn't
* disarmed -- it keeps its dark gray background or whatever its L&F uses to
* indicate that the button is currently being pressed.
*/
public void mouseDragged(MouseEvent e) {
if (needToRedispatch)
redispatchMouseEvent(e);
}
public void mouseMoved(MouseEvent e) {
if (needToRedispatch)
redispatchMouseEvent(e);
}
public void mouseClicked(MouseEvent e) {
if (needToRedispatch)
redispatchMouseEvent(e);
}
public void mouseEntered(MouseEvent e) {
if (needToRedispatch)
redispatchMouseEvent(e);
}
public void mouseExited(MouseEvent e) {
if (needToRedispatch)
redispatchMouseEvent(e);
}
public void mousePressed(MouseEvent e) {
if (needToRedispatch)
redispatchMouseEvent(e);
}
public void mouseReleased(MouseEvent e) {
if (needToRedispatch) {
redispatchMouseEvent(e);
inDrag = false;
}
}
private void redispatchMouseEvent(MouseEvent e) {
boolean inButton = false;
boolean inMenuBar = false;
Point glassPanePoint = e.getPoint();
Component component = null;
Container container = contentPane;
Point containerPoint = SwingUtilities.convertPoint(this,
glassPanePoint, contentPane);
int eventID = e.getID();
if (containerPoint.y < 0) {
inMenuBar = true;
container = menuBar;
containerPoint = SwingUtilities.convertPoint(this, glassPanePoint,
menuBar);
testForDrag(eventID);
}
//XXX: If the event is from a component in a popped-up menu,
//XXX: then the container should probably be the menu's
//XXX: JPopupMenu, and containerPoint should be adjusted
//XXX: accordingly.
component = SwingUtilities.getDeepestComponentAt(container,
containerPoint.x, containerPoint.y);
if (component == null) {
return;
} else {
inButton = true;
testForDrag(eventID);
}
if (inMenuBar || inButton || inDrag) {
Point componentPoint = SwingUtilities.convertPoint(this,
glassPanePoint, component);
component.dispatchEvent(new MouseEvent(component, eventID, e
.getWhen(), e.getModifiers(), componentPoint.x,
componentPoint.y, e.getClickCount(), e.isPopupTrigger()));
}
}
private void testForDrag(int eventID) {
if (eventID == MouseEvent.MOUSE_PRESSED) {
inDrag = true;
}
}
} |
Partager