如何调用paintComponent(Graphics g)? repaint()每次都不会工作

时间:2013-04-17 22:49:11

标签: java swing jframe repaint paintcomponent

Java SE6程序中的以下内容是一个tic tac toe游戏:

我有一个类MiniPanel,它扩展了我在网格中的JPanel。如果用户单击其中一个,则监听器会执行某些操作...最终,它会在单击的MiniPanel上调用方法placeX()或placeO()。这会做一些事情,然后打印出一条消息,说明该方法被调用,下一行调用animatePanel()方法,该方法调用内部的repaint(),之前打印出一条消息。

班级MiniPanel也会使用首先打印出一条消息说明paintComponent被调用的方法覆盖 paintComponent(Graphics g) 。{{1}然后做其他事情。

问题在于,当我点击super.paintComponent(g)时,会显示前2条消息,其中显示MiniPanelplaceX()和animatePanel()被调用,这意味着placeO() 必须已被调用。但repaint()从未被调用过!另一个奇怪的事情是,如果我在初始化paintComponent(Graphics g)时直接调用placeX(),则无效。

我只有MiniPanel被覆盖,没有别的。

这是paintComponent:

paintComponent(Graphics g)

placeX(placeO几乎是一样的):

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

animatePanel:

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

计时器反复调用它以获得一点动画:

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

0 个答案:

没有答案