gpt4 book ai didi

java - 这个阻塞的 GlassPane 有问题吗?

转载 作者:太空宇宙 更新时间:2023-11-04 08:55:21 28 4
gpt4 key购买 nike

我在网络上发现了这个阻塞 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();
}
}
}
}

最佳答案

乍一看,我发现这里有几个问题,主要是在 eventDispatched() 方法中及其周围。

首先,既然您从未将此对象作为 AWTEventListener 添加到任何内容中,那么为什么要实现 AWTEventListener 呢?您的意思是将此对象添加到自身作为事件监听器吗?您是否将其作为事件监听器添加到此处未显示的代码中的其他位置?

第二,为什么要测试EventObject实例?我将您的代码剪切并粘贴到 Eclipse 中,Eclipse 立即警告我所有 AWTEvent 对象都是 EventObject 的实例。因此,您可以摆脱该测试 - 它永远是正确的。

第三,你到底为什么要诉诸反射(reflection)?看来您正在尝试对不具有 Swing-only 方法的 AWT 事件使用该方法。这种方法行不通 - 尝试反射调用不存在的方法只会抛出异常,此代码将默默地捕获并忽略该异常。

最后,你为什么要重新发明轮子?一些快速谷歌搜索揭示了一些simpler examples和一些more complicated examples您可以将其作为您工作的起点,并且可能会让您更接近您真正想要的东西。

关于java - 这个阻塞的 GlassPane 有问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2413102/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com