井字游戏Java SE6程序中的以下内容:

我有一个MiniPanel类,用于扩展网格中的JPanel 如果用户单击其中之一,则侦听器将执行一些操作,然后...最终,它将在被单击的MiniPanel上调用方法placeX()或placeO()。 然后执行一些操作,然后打印出一条消息,指出该方法已被调用,并且下一行调用animatePanel()方法,该方法在内部调用repaint(),并在此之前打印出一条消息。

MiniPanel类还使用一种方法重写了paintComponent(Graphics g) ,该方法首先打印出一条消息,说该paintComponent被称为THEN,它执行super.paintComponent(g) ,然后执行其他操作。

问题是,当我单击一个MiniPanel ,出现了前两个消息,称placeX()placeO()和animatePanel()被调用,这意味着必须已调用repaint() 但是从未调用paintComponent(Graphics g) 另一个怪异的事情是,如果我在MiniPanel初始化时直接调用placeX() ,则它可以工作,但在其他情况下则不能。

我只覆盖了paintComponent(Graphics g) ,没有别的。

这是paintComponent:

public void paintComponent(Graphics g){
        if (Controller.DEBUG) System.out.println("MiniPanel at ("+row+", "+col+") received paintComponent (is repainting now).");
        super.paintComponent(g);
        ...
        ...
    }

placeX(placeO几乎是同一件事):

    public void placeX(){
    ...
    if (Controller.DEBUG) System.out.println("MiniPanel at ("+row+", "+col+") received placeX.");
    ...
    animatePanel();
}

animatePanel:

        private void animatePanel() {
    if (Controller.DEBUG) System.out.println("MiniPanel at ("+row+", "+col+") doing animatePanel().");
    timer.start();
}

计时器反复调用此动画来制作动画:

        private ActionListener taskPerformer = new ActionListener() {
    public void actionPerformed(ActionEvent evt) {
        if (Controller.DEBUG) System.out.println("MiniPanel at ("+row+", "+col+") doing actionPerformed().");
        ...
        if (Controller.DEBUG) System.out.println("MiniPanel at ("+row+", "+col+") about to repaint... Should receive paintComponent command!");
        repaint();
    }
};

  ask by sudo translate from so

本文未有回复,本站智能推荐: