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???真没找出哪里有问题
还有这两个按钮用了一个监听器然后判断事件源,是不是这样不太好呀?求各位指点一下吧

解决方案 »

  1.   

    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 eventsif (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;
    }
      

  2.   

    没记错的话repaint不立即触发paint(),另外也不是每次repaint都触发paint();repaint只是增加了一个GUI事件,至于事件什么时候被处理,必然是要等到当前事件处理完毕之后了。所以在你下面这句话中:
    rm_previous = myPanel.getRnm();
    myPanel.repaint();
    rm_now = myPanel.getRnm();rm_previous === rm_now