Есть ли проблема с этой блокировкой GlassPane? - PullRequest
1 голос
/ 10 марта 2010

Я нашел этот блокирующий класс 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();
            }
        }
    }
}

1 Ответ

1 голос
/ 10 марта 2010

На первый взгляд, я вижу здесь несколько проблем, в основном внутри и вокруг метода eventDispatched().

Во-первых, почему вы вообще реализуете AWTEventListener, поскольку вы никогда не добавляете этот объект ни к чему как AWTEventListener? Вы хотели добавить этот объект себе в качестве прослушивателя событий? Вы добавляете его в качестве прослушивателя событий где-то еще в коде, который здесь не показан?

Во-вторых, почему вы тестируете e instanceof EventObject? Я вырезал и вставил ваш код в Eclipse, который сразу предупредил меня, что все AWTEvent объекты являются экземплярами EventObject. Таким образом, вы можете избавиться от этого теста - он всегда будет правдой.

В-третьих, с какой стати вы прибегаете к размышлению? Похоже, вы пытаетесь использовать метод Swing-only для событий AWT, у которых его нет. Такой подход не сработает - попытка рефлексивно вызвать несуществующий метод просто вызовет исключение, которое этот код будет молча перехватывать и игнорировать.

Наконец, почему ты изобретаешь колесо? Некоторый быстрый поиск в Google показывает более простых примеров и некоторых более сложных примеров , которые вы могли бы использовать в качестве отправной точки для своей работы и которые, вероятно, приблизят вас к тому, что вы действительно хотите здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...