我在做一個禁止使用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