java - 使用 Swing 通过鼠标事件影响 boolean 变量

标签 java swing

我不确定为什么我的鼠标监听器设置的鼠标事件不会影响帽子是否被绘制。变量“mouseInside”似乎不受鼠标事件的影响。如何使用鼠标事件将变量更改为 false?

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

public class EyesOpen extends JPanel{

    private Ellipse2D.Double head;
    private Ellipse2D.Double eyeOne;
    private Ellipse2D.Double eyeTwo;
    private Rectangle2D.Double hatBody;
    boolean mouseInside;



    public EyesOpen(){

        this.setFocusable(true);
        this.requestFocus();
        this.setPreferredSize(new Dimension(500,500));

        head = new Ellipse2D.Double(180,180,140,140);
        eyeOne = new Ellipse2D.Double(220,220,20,20);
        eyeTwo = new Ellipse2D.Double(260,220,20,20);
        hatBody = new Rectangle2D.Double(170,180,160,20);



    class MyMouseListener implements MouseListener{
        public void mouseClicked(MouseEvent e) { 
       }
        public void mouseEntered(MouseEvent e){

           mouseInside=true;

        }
        public void mouseExited(MouseEvent e){
             mouseInside=false;


        }
        public void mousePressed(MouseEvent e){

        }
        public void mouseReleased(MouseEvent e){
        }
}
this.addMouseListener(new MyMouseListener());    
}

    public void paintComponent(Graphics g){

        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D)g;

        g2.setPaint(Color.BLUE);
        g2.fill(head);

        g2.setPaint(Color.BLACK);
        g2.fill(eyeOne);

        g2.setPaint(Color.BLACK);
        g2.fill(eyeTwo);

        if(mouseInside=true){
        g2.setPaint(Color.BLACK);
        g2.fill(hatBody);}

    }

public static void main(String[] args){
    JFrame f = new JFrame("Head");

    f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    f.setLayout(new FlowLayout());
    f.add(new EyesOpen());
    f.pack();
    f.setVisible(true);
    }
}

最佳答案

不要忘记在更改 boolean 值后调用 repaint()

准确地说,您可以指定通过 EyesOpen.this.repaint(); 调用绘图组件的方法,但这在当前程序中不是绝对必要的(我不要想)。

其他问题:

  • paintComponent(...) 方法应指定为protected 而不是public。暴露它没有任何意义,因为它需要暴露。
  • 不要忘记使用@Override 注释,任何时候您认为您正在覆盖一个方法。尽管此计划可能无关紧要,但它在将来挽救您的后腿。
  • 您需要通过将 JFrame 创建代码放在 Runnable 中,然后通过将 Runnable 放入 SwingUtilities.invokeLater(/** 你的 Runnable 在这里 **/);

关于java - 使用 Swing 通过鼠标事件影响 boolean 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26922554/

相关文章:

java - Card Layout本来会切换面板,为什么程序启动后就不切换了?

java - 从 Nashorn 脚本中对 Java 对象设置 "Callable"

java - 使用 JColorChooser 更改 JPanel 颜色

java - GridBagLayout 和 FlowLayout : Components appearing at unexpected positions

Java子对象运行父对象的方法

java - 在Java主窗口上画线

java - 使用 jsoup 提取 https url

java - 如何以编程方式构建 pom 文件的有效模型?

java - 什么在 MIDP 编程中相当于 swing-application 的 JButton?

java - Sqlite 数据与桌面应用程序