本帖最后由 turtlefly 于 2012-01-14 22:14:32 编辑

解决方案 »

  1.   

    简单的调用super.*****()?不可以吧?
      

  2.   

    以下是MineSweeper类:
    import java.awt.*;
    import javax.swing.*;public class MineSweeper {
    static JFrame f = new JFrame("Mine Sweeper");
    static MyDrawPanel mdp;

    public static void main(String[] args){
    MineSweeper ms = new MineSweeper();
    ms.go();
    }

    public void setUpGui(){
    mdp = new MyDrawPanel();
    JButton j = new MineButton(3,4,'a');
    mdp.add(j);
    f.setLayout(new BorderLayout());
    f.setContentPane(mdp);
    f.setBounds(300,300,600,400);
    f.setResizable(true);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setVisible(true);
    }

    public void go(){
    setUpGui();
    }

    class MyDrawPanel extends JPanel{
    @Override
    public void repaint() {
    // TODO Auto-generated method stub
    super.repaint();
    }
    @Override
    public void updateUI() {
    // TODO Auto-generated method stub
    super.updateUI();
    }
    @Override
    public void validate() {
    // TODO Auto-generated method stub
    super.validate();
    }
    }
    }
    以下是MineButton类:
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.JButton;public class MineButton extends JButton{
    //state of this mine button
    //1:unsigned
    //2:opened
    //3:ed
    //4:questioned
    private int state=0;

    private boolean ifAMine;
    private int x;
    private int y;

    //char of mine number around this button
    //mineNumer=='m' shows a mine here;
    private char mineNumber;

    public MineButton(int x, int y, char c) {
    this.x = x;
    this.y = y;
    if((this.mineNumber=c)=='m'){
    ifAMine = true;
    }
    //this.setBackground(Color.BLUE);
    //this.addMouseListener(new ClickMouse());
    }

    @Override
    public void repaint() {
    // TODO Auto-generated method stub
    super.repaint();
    }
    @Override
    public void paintComponents(Graphics g) {
    // TODO Auto-generated method stub
    super.paintComponents(g);
    }

    @Override
    public void updateUI() {
    // TODO Auto-generated method stub
    super.updateUI();
    }

    }
      

  3.   


    抱歉我贴上来的一段删去了一些getter setter和实现的MouseListener,删去之后问题可以解决,但是把这些加上,原始的MineButton类是下面这样的,就会出现上述问题,请问知道是为什么吗?
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.JButton;public class MineButton extends JButton{
    //state of this mine button
    //1:unsigned
    //2:opened
    //3:ed
    //4:questioned
    private int state=0;

    private boolean ifAMine;
    private int x;
    private int y;

    //char of mine number around this button
    //mineNumer=='m' shows a mine here;
    private char mineNumber;

    public MineButton(int x, int y, char c) {
    this.x = x;
    this.y = y;
    if((this.mineNumber=c)=='m'){
    ifAMine = true;
    }
    //this.setBackground(Color.BLUE);
    //this.addMouseListener(new ClickMouse());
    }

    @Override
    public void repaint() {
    // TODO Auto-generated method stub
    super.repaint();
    }
    @Override
    public void paintComponents(Graphics g) {
    // TODO Auto-generated method stub
    super.paintComponents(g);
    }

    @Override
    public void updateUI() {
    // TODO Auto-generated method stub
    super.updateUI();
    }

    void leftClick(){
    if (ifAMine==true) {
    System.out.println("Loser!");
    }
    else{
    System.out.println("Number of mine is:"+mineNumber);
    }
    }
    void rightClick(){
    state = 3;
    System.out.println("Grid ("+x+","+y+") have a flag.");
    }
    void leftRightClick(){
    //实现一下打印周围格子坐标的动作
    }
    class ClickMouse implements MouseListener{
    public void mouseEntered(MouseEvent event) {
    ((MineButton)(event.getSource())).setBackground(Color.CYAN);
    }
    public void mousePressed(MouseEvent event){
    ((MineButton)(event.getSource())).setBackground(Color.GRAY);
    }
    public void mouseClicked(MouseEvent event){
    // System.out.println("("+((MineButton)(event.getSource())).getX()
    // +","+((MineButton)(event.getSource())).getY()+")");
    System.out.println("("+x+","+y+")");
    ((MineButton)(event.getSource())).setText(""+mineNumber);

    // TODO 将在此处添加您的处理代码:
    int buttonKey = event.getButton();
    if( buttonKey == event.BUTTON1 && event.getClickCount() == 2 ) {
    System.out.println("双击了鼠标左键:");
    } else if( buttonKey == event.BUTTON2 ) {
    System.out.println("点击了鼠标中键");
    } else if( buttonKey == event.BUTTON3 ) {
    System.out.println("点击了鼠标右键");
    }
    }

    public void mouseExited(MouseEvent event) {
    ((MineButton)(event.getSource())).setBackground(Color.BLUE);
    }
    public void mouseReleased(MouseEvent event) {
    //judge();
    }
    }


    public char getMineNumber(){
    return mineNumber;
    } public int getState() {
    return state;
    } public void setState(int state) {
    this.state = state;
    } public int getX() {
    return x;
    } public void setX(int x) {
    this.x = x;
    } public int getY() {
    return y;
    } public void setY(int y) {
    this.y = y;
    }
    }
      

  4.   

    问题就出在
    getX 和 getY 这两个方法上
    这个你看起来似乎只是你内部变量的两个 get 方法
    其实你无意中覆盖了 component 的原有的 getX 和 getY 方法
    这两个方法在呈现控件和布局时会被 Swing 内部代码调用到
    你重写了,导致布局和呈现时无法获得正确的 x,y 坐标
    才出的问题