Java 使用Swing使用鼠标事件影响布尔变量

Java 使用Swing使用鼠标事件影响布尔变量,java,swing,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; pr

我不确定为什么我的鼠标侦听器设置的鼠标事件不会影响是否绘制帽子。变量“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);
    }
}

更改布尔值后,不要忘记调用
repaint()

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

其他挑剔之处:

  • paintComponent(…)
    方法应指定为
    protected
    public
    。把它暴露出来是没有意义的,因为它需要暴露出来
  • 当您认为正在重写某个方法时,不要忘记使用
    @Override
    注释。虽然这可能与该计划无关,但它将在未来拯救你的后盾
  • 您需要在主方法中的Swing线程上启动GUI,方法是将JFrame创建代码放在Runnable中,然后将该Runnable放入
    SwingUtilities,将其排队到事件队列中

@AndrewThompson:我们同时回答。我把我的答案写成了“社区维基”,因为它看起来太琐碎了,无法得分。@AndrewThompson:也许我错了,但我认为这不是问题。由于MouseListener接口没有此方法,更重要的是,其内部类也没有此方法,因此它将默认为外部类,即绘图组件。@HovercraftFullOfEels很酷,编辑效果很好。噪声已删除。我尝试了重新绘制()和EyesOpen。this.repaint();在“mouseInside=true”和“mouseInside=false”之后,但均无效。有没有可能是因为mouseInside没有被更改,所以当它重新绘制时,它总是被读为真的?@brian如果(mouseInside=true)
它不应该是
,而是
如果(mouseInside)
您,亲爱的先生,是一位绅士和学者。谢谢你。