Java 这个封闭的玻璃窗有问题吗?
我在网上发现了这个阻止GlassPane的类,我很想知道你们中的一些人是否认为它有什么问题Java 这个封闭的玻璃窗有问题吗?,java,swing,Java,Swing,我在网上发现了这个阻止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.
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中,它立即警告我所有AWTEvent
对象都是EventObject
的实例。所以,你可以摆脱这个测试——它永远是真实的
第三,你究竟为什么要诉诸反思?看起来好像您正在尝试对AWT事件使用仅Swing的方法,而AWT事件没有该方法。这种方法行不通——尝试反射式调用一个不存在的方法只会抛出一个异常,这段代码将静默地捕获并忽略该异常
最后,你为什么要重新发明轮子?通过快速的谷歌搜索,可以发现一些可以作为工作起点的东西,这些东西可能会让你更接近你真正想要的东西。只要看一眼,我就发现这里有几个问题,主要是
eventDispatched()
方法中的问题
首先,既然您从未将此对象作为AWTEventListener
添加到任何对象中,那么为什么要实现AWTEventListener
?您是否打算将此对象作为事件侦听器添加到其自身?您是否将其作为事件监听器添加到此处未显示的代码中的其他地方
其次,为什么要测试EventObject的实例?我将您的代码剪切并粘贴到Eclipse中,它立即警告我所有AWTEvent
对象都是EventObject
的实例。所以,你可以摆脱这个测试——它永远是真实的
第三,你究竟为什么要诉诸反思?看起来好像您正在尝试对AWT事件使用仅Swing的方法,而AWT事件没有该方法。这种方法行不通——尝试反射式调用一个不存在的方法只会抛出一个异常,这段代码将静默地捕获并忽略该异常
最后,你为什么要重新发明轮子?通过谷歌快速搜索,可以发现一些可以作为工作起点的信息,这些信息可能会让你更接近你真正想要的信息。我不喜欢这种语气,我很清楚我不是这段代码的作者,不过还是要谢谢你的链接。我不喜欢这个语气,我很清楚我不是这段代码的作者,但还是要谢谢你的链接。