- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 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/
使用登录后,我想吐出用户名。 但是,当我尝试单击登录按钮时, 它给了我力量。 我看着logcat,但是什么也没显示。 这种编码是在说。 它将根据我在登录屏幕中输入的名称来烘烤用户名。 不会有任何密码。
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎是题外话,因为它缺乏足够的信息来诊断问题。 更详细地描述您的问题或include a min
我是一名优秀的程序员,十分优秀!