我在做一个禁止使用JButton的程序。我被要求在awt矩形上使用鼠标事件监听器。点击按钮的结果应该是:repaint导致mouseListener注册没有发生的点击
- 增加10到一个变量在另一个类中
- 重绘表示燃料米的矩形
的问题是,当我把在重绘方法mouseClicked侦听器的结尾,在第一次单击之后,侦听器将注册多次点击而不是一次。下面是实现相同类型的按钮替换I使用的一个程序(在此发现StackExchange):
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.*;
public class Gui2 extends JFrame {
JFrame frame = new JFrame();
MyDrawPanel drawpanel = new MyDrawPanel();
public static void main(String[] args) {
Gui2 gui = new Gui2();
gui.go();
}
public void go() {
frame.getContentPane().add(drawpanel);
// frame.addMouseListener(this);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 300);
frame.setVisible(true);
}
}
class MyDrawPanel extends JComponent implements MouseListener {
private boolean mouseClicked = false;
public void paintComponent(Graphics g) {
int red = (int) (Math.random() * 255);
int green = (int) (Math.random() * 255);
int blue = (int) (Math.random() * 255);
Color startrandomColor = new Color(red, green, blue);
red = (int) (Math.random() * 255);
green = (int) (Math.random() * 255);
blue = (int) (Math.random() * 255);
Color endrandomColor = new Color(red, green, blue);
Graphics2D g2d = (Graphics2D) g;
this.addMouseListener(this);
GradientPaint gradient = new GradientPaint(70, 70, startrandomColor,
150, 150, endrandomColor);
g2d.setPaint(gradient);
g2d.fillOval(70, 70, 100, 100);
}
@Override
public void mouseClicked(MouseEvent e) {
if ((e.getButton() == 1)
&& (e.getX() >= 70 && e.getX() <= 170 && e.getY() >= 70 && e
.getY() <= 170)) {
mouseClicked = true;
this.repaint();
if(mouseClicked == true){
System.out.println("click");
}
// JOptionPane.showMessageDialog(null,e.getX()+ "\n" + e.getY());
}
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
}
当在帧中的椭圆被点击一次时,一个“点击”被打印在控制台上。当它由于某种原因第二次点击时,它会打印2“点击”。对于第三次点击,它打印3等等。为什么repaint方法会这样做,以及如何在awt椭圆上使用它,而无需注册多个点击?
请参阅编辑回答。 – 2015-04-05 04:00:59
@AndrewThompson:因为它在项目规范中。 – grumpbot 2015-04-06 00:27:38