我有一个JFrame,其中JPanelFlowLayout。面板上显示JButton。我希望每当鼠标从JFrame中移出时,就关闭JFrame。工作正常。

但是,即使将鼠标移到JButton上,它也一样!!我不想要那个!

JFrame类的代码,MyFrame.java

import javax.swing.*;
import java.awt.event.*;

public class MyFrame extends JFrame {

    JButton btnOne;     JPanel panOne;

    public MyFrame() {}
    public MyFrame() {
        this.setSize(400, 400);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.initComps();
        this.setFrameMouseActions();
        this.setVisible(true);
    }

    public void initComps() {
        panOne = new JPanel();
        btnOne = new JButton("Click Me!");
        panOne.add(btnOne);
        this.add(panOne);
    }

    public void setFrameMouseActions() {
        this.addMouseListener(new MouseListener() {
            public void mouseExited(MouseEvent e) {
                dispose();
                JOptionPane.showMessageDialog(null, "Disposed", "Disposed", JOptionPane.INFORMATION_MESSAGE);
                System.exit(0);
            }
            public void mouseReleased(MouseEvent e) {}
            public void mousePressed(MouseEvent e) {}
            public void mouseEntered(MouseEvent e) {}
            public void mouseClicked(MouseEvent e) {}
        });
    }
}


主要类别代码,MouseMain.java

public class MouseMain {
    public static void main(String[] args) {
        MyFrame frameOb = new MyFrame();
    }
}


注意:我也尝试过使用null layout(尽管它是不好的做法!)。但是都一样。该代码是我的一个大型项目的简化版本。

最佳答案

// ew。太难了我几乎找不到。

重点是两种方法的区别。首先单击链接。并查看此代码。

frame.getContentPane().getSize(),frame.getWidth()

package test;

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class TestCursorOut extends JFrame {

    private JPanel contentPane;
    private static TestCursorOut frame;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    frame = new TestCursorOut();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public TestCursorOut() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(200, 150, 450, 300);
        contentPane = new JPanel();
        contentPane.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseExited(MouseEvent e) {

                if(!(e.getX() <frame.getContentPane().getWidth() && e.getX() > 0))
                {
                    ExitCursorMethod();
                }

                if(!(e.getY() <frame.getContentPane().getHeight() && e.getY() > 0))
                {
                    ExitCursorMethod();
                }
            }

            public void ExitCursorMethod() {
                dispose();
                JOptionPane.showMessageDialog(null, "Disposed", "Disposed", JOptionPane.INFORMATION_MESSAGE);
                System.exit(0);
            }
        });
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);

        JButton btnNewButton = new JButton("New button");
        btnNewButton.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseEntered(MouseEvent e) {

            }
        });
        btnNewButton.setBounds(160, 10, 97, 23);
        contentPane.add(btnNewButton);
    }

}

09-30 14:59
查看更多