gpt4 book ai didi

java - 我想让我的 JLayeredPane 捕捉所有事件

转载 作者:行者123 更新时间:2023-11-30 09:03:50 25 4
gpt4 key购买 nike

我有一个 JFrame,我想在某些加载过程中将其设置为禁用。为此,我创建了 DisablingLayeredPane 类:

public class DisablingLayeredPane extends JPanel {

@Override
protected void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D) g.create();
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.2f));
g2d.setColor(Color.BLACK); // With 0.2f alpha it looks like light gray
g2d.fillRect(0, 0, getWidth(), getHeight());
g2d.dispose();
}
}

在加载过程开始时,我调用

frame.getLayeredPane().add(darkeningPane, JLayeredPane.MODAL_LAYER);

但问题是,这个变暗的 Pane 没有捕捉到任何事件,我仍然可以按下框架上的按钮。我也试过 AWTEventListener 来消耗这个框架的所有事件,但还有另一个问题:有时我需要显示模态对话框进行一些确认,模态对话框的事件也会被消耗(我可以'按任何按钮)。当然,我可以使用一些技巧,比如在框架上方使用 transparent window 而不是 darkening pane,或者使用大量的 if-else 语句AWTEventListener,但我正在寻找一些漂亮的解决方案(如果有的话)。

提前致谢。

更新:我还尝试将 Mouse and Key Listeners 添加到分层面板,但是有一个新问题:如果使用 JDialog 而不是 JFrame,分层面板的 KeyListener 不会捕捉到 ESC 键按下,对话框会被释放。

UPD2:我试过 frame.setGlassPane(darkeningPane) 而不是设置为图层,但没有效果。

最佳答案

对于JLayeredPane来说,通过添加一个简单的组件作为层是不可能拦截事件的。似乎很多开发人员都没有意识到这一点。事件通常直接发送到包含鼠标事件坐标的最深的子组件,或者在忽略父级的键事件的情况下发送到焦点组件,更不用说甚至不是目标组件父级的层。

谢天谢地,Java 7 中添加了一个组件,可以为您完成复杂的操作,JLayer ,不要与 JLayeredPane 混淆。

这是一个如何使用它的例子:

JFrame f=new JFrame("Disabling via JLayer");
final JLayer<JTree> layer = new JLayer<JTree>(new JTree(), new LayerUI<JTree>() {
@Override
public void eventDispatched(AWTEvent e, JLayer<? extends JTree> l) {
if(e instanceof InputEvent) ((InputEvent)e).consume();
}
@Override
public void paint(Graphics g, JComponent c) {
super.paint(g, c);
Graphics2D g2d = (Graphics2D) g.create();
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.2f));
g2d.setColor(Color.BLACK);
g2d.fillRect(0, 0, c.getWidth(), c.getHeight());
g2d.dispose();
}
});
f.setContentPane(layer);
layer.setLayerEventMask(~0);
f.pack();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);

关于java - 我想让我的 JLayeredPane 捕捉所有事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25501039/

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