日期:2014-05-20  浏览次数:20719 次

一个很简单的事件监听问题,拜托各位帮下忙
[code=Java][/code]

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.lang.invoke.SwitchPoint;
import java.util.Random;

import javax.swing.*;

import org.omg.CORBA.PRIVATE_MEMBER;

public class Game {

public static void main(String[] args) {

EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
Graph graph = new Graph();
graph.setVisible(true);
}
});
}

}
 class Graph extends JFrame {
public Graph() {
setSize(DEFAULT_WIDTH, DEFAULT_HEIGTH);
setLayout(new GridLayout(2, 2));

myPanel = new MyPanel();
JPanel jPane2 = new JPanel();
add(jPane2);
jPane2.add(myPanel);
jPane2.setLayout(null);//
myPanel.setSize(100, 100);
myPanel.setLocation(0, 0);

textArea = new JTextArea();
add(textArea);

JPanel jPanel = new JPanel();
jPanel.setLayout(new GridLayout(2, 1));
add(jPanel);

jButton1 = new JButton("√");
jButton1.addActionListener(listener);
jButton1.setFont(new Font("黑体", Font.BOLD, 45));
jButton2 = new JButton("×");
jButton2.setFont(new Font("宋体", 2, 45));
jButton2.addActionListener(listener);
jPanel.add(jButton1);
jPanel.add(jButton2);
}

private ActionListener listener = new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
rm_previous = myPanel.getRnm();
myPanel.repaint();
rm_now = myPanel.getRnm();
Object sourceObject = e.getSource();// get the source of events

if (sourceObject == jButton1) {
if (rm_previous == rm_now)
score += 5;
else {
score -= 3;
}
} else if (sourceObject == jButton2) {
if (rm_previous == rm_now)
score -= 3;
else {
score += 5;
}
}
textArea.setText(Integer.toString(score));
}

};
private int score = 0, rm_previous, rm_now;
private JButton jButton1, jButton2;
private MyPanel myPanel;
private JTextArea textArea;
public static final int DEFAULT_WIDTH = 400;
public static final int DEFAULT_HEIGTH = 300;
}
 class MyPanel extends JPanel {
public void paint(Graphics graphics) {
// super.paint(graphics);
Graphics g2d = (Graphics2D) graphics;
g2d.setColor(Color.black);
Rectangle rectangle = new Rectangle(0, 0, GRA_HEIGTH, GRA_HEIGTH);
g2d.setColor(Color.white);
g2d.fillRect(0, 0, GRA_HEIGTH, GRA_HEIGTH);

rdm = new Random().nextInt(3);
switch (rdm) {
case 0 :
g2d.setColor(Color.blue);
g2d.fillRect(0, 0, GRA_HEIGTH, GRA_HEIGTH);
break;
case 1 :
g2d.setColor(Color.yellow);
g2d.fillOval(0, 0, GRA_HEIGTH, GRA_HEIGTH);
break;
default :
g2d.setColor(Color.green);
g2d.drawLine(0, GRA_HEIGTH, GRA_HEIGTH / 2, 0);
g2d.drawLine(GRA_HEIGTH, GRA_HEIGTH, GRA_HEIGTH / 2, 0);
g2d.drawLine(0, GRA_HEIGTH, GRA_HEIGTH, GRA_HEIGTH);
break;
}
}
public int getRnm() {
return rdm;
}
private int rdm;
public static final int GRA_HEIGTH = 100;
}



我想知道为什么每次按下√按钮就+5,按下×就-3???真没找出哪里有问题
还有这两个按钮用了一个监听器然后判断事件源,是不是这样不太好呀?求各位指点一下吧

------解决方案--------------------
没记错的话repaint不立即触发paint(),另外也不是每次repaint都触发paint();

repaint只是增加了一个GUI事件,至于事件什么时候被处理,必然是要等到当前事件处理完毕之后了。

所以在你下面这句话中:
rm_previous = myPanel.getRnm();
myPanel.repaint();
rm_now = myPanel.getRnm();

rm_previous === rm_now