2010-03-09 10 views
1

J'ai trouvé cette classe GlassPane bloquante sur le web et je suis curieux de savoir si certains d'entre vous y voient un problème.Y at-il un problème avec ce blocage GlassPane?

public final class BlockingGlassPane extends JComponent implements AWTEventListener { 

// Events will be consumed for this window. 
private Window parentWindow; 
// Focus will be returned to this component. 
private Component lastFocusOwner; 

private final Toolkit toolkit; 

public BlockingGlassPane() { 
    super(); 
    setOpaque(false); 
    addMouseListener(new MouseAdapter() { 
    }); 
    addKeyListener(new KeyAdapter() { 
    }); 
    setInputVerifier(new InputVerifier() { 
     @Override 
     public boolean verify(JComponent anInput) { 
      return false; 
     } 
    }); 
    toolkit = Toolkit.getDefaultToolkit(); 
} 

@Override 
public void setVisible(boolean b) { 
    if (b) { 
     if (parentWindow == null) { 
      parentWindow = SwingUtilities.windowForComponent(this); 
     } 
     Component focusOwner = parentWindow.getFocusOwner(); 
     if (focusOwner != this) { 
      lastFocusOwner = focusOwner; 
     } 
     toolkit.addAWTEventListener(this, AWTEvent.KEY_EVENT_MASK); 
     toolkit.addAWTEventListener(this, AWTEvent.MOUSE_EVENT_MASK); 
     requestFocus(); 
     setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); 
    } else { 
     toolkit.removeAWTEventListener(this); 
     if (lastFocusOwner != null) { 
      lastFocusOwner.requestFocus(); 
      lastFocusOwner = null; 
     } 
     setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); 
    } 
    super.setVisible(b); 
} 

@SuppressWarnings("unchecked") 
public void eventDispatched(AWTEvent e) { 
    Object source = e.getSource(); 
    if (e instanceof EventObject && source instanceof Component) { 
     Component src = (Component) source; 
     EventObject ev = e; 
     if (SwingUtilities.windowForComponent(src) == parentWindow) { 
      try { 
       Class[] cls = {}; 
       Object[] args = {}; 
       ev.getClass().getMethod("consume", cls).invoke(ev, args); 
      } catch (Exception ex) { 
       // ex.printStackTrace(); 
      } 
     } 
    } 
} 

Répondre

1

Juste un coup d'oeil, je vois ici plusieurs problèmes, surtout dans et autour de la méthode eventDispatched(). Tout d'abord, pourquoi implémentez-vous AWTEventListener, puisque vous n'ajoutez jamais cet objet à un AWTEventListener? Vouliez-vous ajouter cet objet à lui-même en tant qu'écouteur d'événements? L'ajoutez-vous en tant qu'écouteur d'événement ailleurs dans le code qui n'est pas affiché ici?

Deuxièmement, pourquoi testez-vous e instanceof EventObject? J'ai coupé et collé votre code dans Eclipse, qui m'a immédiatement averti que tous les objets AWTEvent sont des instances de EventObject. Donc, vous pouvez vous débarrasser de ce test - Ce sera toujours vrai.

Troisièmement, pourquoi diable avez-vous recours à la réflexion? Il semble que vous essayez d'utiliser une méthode Swing uniquement sur les événements AWT qui ne l'ont pas. Cette approche ne fonctionnera pas - Tenter d'appeler une méthode inexistante de manière réfléchie lancera une exception, que ce code attrapera et ignorera en silence.

Enfin, pourquoi réinventez-vous la roue? Certains googling rapide révèle certains simpler examples et certains more complicated examples que vous pourriez utiliser comme point de départ pour votre travail et qui vous rapprocherait probablement de ce que vous voulez vraiment ici.

+0

Je n'aime pas le ton et j'ai été assez clair que je ne suis pas l'auteur de ce code, mais merci quand même pour les liens. – Rhangaun

Questions connexes