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