Java JFrame停止接收鼠标事件

Java JFrame停止接收鼠标事件,java,swing,jframe,jbutton,mouse-listeners,Java,Swing,Jframe,Jbutton,Mouse Listeners,我有一个JFrame,它代表我的Java应用程序的GUI。 我有一个自定义按钮,来自JComponent,创建并放置在这个JFrame上。按下此按钮时,将显示一个模式对话框 package quixote.sscce; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; im

我有一个JFrame,它代表我的Java应用程序的GUI。 我有一个自定义按钮,来自JComponent,创建并放置在这个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);
            }
        });
    }
}
问题是,在模态对话框出现后,JFrame停止从鼠标接收鼠标事件。我打开了Spy++并发现来自Windows的MouseEvents被传递到JFrame。所以它们在Java的某个地方被关闭了

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

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);
            }
        });
    }
}
当然,我可以自己跟踪模态对话框的打开,并使我的按钮不被覆盖,但只是好奇,如果有标准的解决方案

您可以看到,当对话框出现时,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);
            }
        });
    }
}

使用非模态对话框,并调用dialog.setAlwaysOnTop(true);
希望这有帮助

我想你可能忘了设置
不透明
设置不透明(true)

这将允许您更改帧的背景颜色,并更改按钮
button.setOpaque(true)


试试看,它可能会对你有所帮助。

你能上传吗?找出问题所在要容易得多。在这里效果很好。它失败的原因是什么?