代码之家  ›  专栏  ›  技术社区  ›  Rhangaun

这个玻璃窗有问题吗?

  •  1
  • Rhangaun  · 技术社区  · 14 年前

    我在网上找到了这个blocking 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 回复  |  直到 14 年前
        1
  •  1
  •   Joe Carnahan    14 年前

    一眼望去,我发现这里有几个问题,主要是 eventDispatched() 方法。

    首先,你为什么要实施 AWTEventListener 因为你从来没有把这个对象作为 AwteventListener公司 ?您是想将此对象作为事件侦听器添加到自身吗?您是否将其作为事件侦听器添加到此处未显示的代码中的其他位置?

    第二,你为什么要测试 e instanceof EventObject ?我将您的代码剪切粘贴到eclipse中,它立即警告我 AWTEvent 对象是 EventObject . 所以,你可以摆脱那个测试-它永远是真的。

    第三,你究竟为什么要诉诸反省?看起来你在尝试对没有swing-only方法的awt事件使用它。这种方法行不通——尝试反射性地调用一个不存在的方法只会抛出一个异常,这段代码将静默地捕获并忽略它。

    最后,你为什么要重新发明轮子?一些快速的谷歌搜索揭示了一些 simpler examples 还有一些 more complicated examples 你可以用它作为你工作的起点,这可能会让你更接近你真正想要的。