gpt4 book ai didi

java - JRootpane - 将玻璃 Pane 设置为可见不会拦截鼠标事件

转载 作者:行者123 更新时间:2023-11-30 08:19:40 26 4
gpt4 key购买 nike

我里面有一个 JFrame 和一个 JPanel 层次结构,我想实现一个内部面板,我可以让它看起来“禁用”(而其他面板不会改变),也就是说,用半透明的灰色层覆盖它并拦截所有发送到此面板的鼠标甚至键盘事件。我一直在寻找解决方案,但还没有真正找到好的解决方案。

我最接近的解决方案是在我使用 JRootPane 时,每当我想禁用它时,我都会使它的玻璃面板可见。玻璃板已设置为不透明且背景为半透明。

我尝试的一个简单例子:

public class Test extends JFrame {
private final JPanel jPanel;

public Test() {
jPanel = new JPanel();
final JButton jButton = new JButton("Hidden");
jButton.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
System.out.println("hidden is clicked!");
}
});
final JRootPane jRootPane = new JRootPane();
jPanel.add(jRootPane);
final JPanel glassPane = new JPanel();
final JButton jButton2 = new JButton();
jButton2.addActionListener(new ActionListener() {
private boolean visible = true;

@Override
public void actionPerformed(ActionEvent e) {
glassPane.setVisible(visible = !visible);
}
});
jPanel.add(jButton2);

jRootPane.getContentPane().add(new JScrollPane(jButton));
glassPane.setBackground(new Color(0.5f, 0.5f, 0.5f, 0.2f));
glassPane.setOpaque(true);
jRootPane.setGlassPane(glassPane);
glassPane.setVisible(true);
getContentPane().add(jPanel);
}

public static void main(String[] strings) {
final Test test = new Test();
test.pack();
test.setVisible(true);
}
}

但问题是,即使玻璃在内容顶部可见,它也不会像记录的那样拦截到达内容的事件 here .

最佳答案

在您的测试类中,您的 glasspane 不会拦截事件,因为您没有告诉它拦截事件(拦截事件不是默认行为)。

在文档中link , 它说

The glass pane

The glass pane is useful when you want to be able to catch events or paint over an area that already contains one or more components. For example, you can deactivate mouse events for a multi-component region by having the glass pane intercept the events. Or you can display an image over multiple components using the glass pane.

您可以这样拦截鼠标事件:

    glassPane.addMouseListener(new MouseAdapter()
{
@Override
public void mouseClicked(MouseEvent e)
{
e.consume();
}

@Override
public void mousePressed(MouseEvent e)
{
e.consume();
}
});

您可以通过这种方式拦截键盘事件:

    glassPane.setFocusable(true);
glassPane.addKeyListener(new KeyListener()
{
@Override
public void keyTyped(KeyEvent e)
{
e.consume();
}

@Override
public void keyReleased(KeyEvent e)
{
e.consume();
}

@Override
public void keyPressed(KeyEvent e)
{
e.consume();
}
});

注意:JPanel 必须是可聚焦的才能拦截键盘事件。

关于java - JRootpane - 将玻璃 Pane 设置为可见不会拦截鼠标事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26714155/

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