gpt4 book ai didi

java - JFrame 停止接收鼠标事件

转载 作者:行者123 更新时间:2023-12-04 05:34:10 26 4
gpt4 key购买 nike

我有一个 JFrame,它代表我的 Java 应用程序的 GUI。我有一个自定义按钮,派生自 JComponent 并创建并放置在此 JFrame 上。按下此按钮会出现一个模式对话框。

问题是,在模式对话框出现后,JFrame 停止接收来自鼠标的鼠标事件。我打开 Spy++ 并发现来自 Windows 的 MouseEvents 被传递到 JFrame。所以它们在 Java 的某个地方被关闭了。

我需要为一件事接收按钮事件 - 当鼠标进入我的自定义按钮区域时,按钮会改变颜色。而且我需要知道鼠标何时离开按钮区域,将按钮更改为其原始颜色。标准 JButton 也存在同样的问题 - 它在模态对话框出现后仍然悬停。

当然,我可以自己跟踪模态对话框的打开,并使我的按钮不悬停,但我很好奇,是否有标准解决方案。

您会看到,JFrame 上的按钮在对话框出现时保持悬停状态。

package quixote.sscce;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class FrameTop extends JFrame implements MouseListener, ActionListener {
private JButton button;


public FrameTop() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(200, 200);
setLocation(100, 100);

setLayout(new BorderLayout());
button = new JButton("Click me");
add(button, BorderLayout.CENTER);
button.addActionListener(this);

addMouseListener(this);
}

@Override
public void actionPerformed(ActionEvent arg0) {
JDialog dialog = new JDialog(this, "dialog");
dialog.setModal(true);
dialog.setLocation(150, 150);
dialog.setSize(100, 100);
dialog.setVisible(true);
}


private int aaa = 0;
@Override
public void mouseClicked(MouseEvent arg0) {
System.out.println("XXX " + aaa);
}

@Override
public void mouseEntered(MouseEvent arg0) {
System.out.println("XXX " + aaa);
}

@Override
public void mouseExited(MouseEvent arg0) {
System.out.println("XXX " + aaa);
}

@Override
public void mousePressed(MouseEvent arg0) {
System.out.println("XXX " + aaa);
}

@Override
public void mouseReleased(MouseEvent arg0) {
System.out.println("XXX " + aaa);
}

public static void main(String args[]) {
final FrameTop top = new FrameTop();
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
top.setVisible(true);
}
});
}
}

最佳答案

我想你可能忘记了 set opaque 即。 setOpaque(true).

这将允许您更改框架和按钮的背景颜色 button.setOpaque(true)

试试吧,它可能对你有帮助。

关于java - JFrame 停止接收鼠标事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12178446/

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