Java SE6程序中的以下内容是一个tic tac toe游戏:
我有一个类MiniPanel
,它扩展了我在网格中的JPanel
。如果用户单击其中一个,则监听器会执行某些操作...最终,它会在单击的MiniPanel上调用方法placeX()或placeO()。这会做一些事情,然后打印出一条消息,说明该方法被调用,下一行调用animatePanel()方法,该方法调用内部的repaint(),之前打印出一条消息。
班级MiniPanel
也会使用首先打印出一条消息说明paintComponent被调用的方法覆盖 paintComponent(Graphics g)
。{{1}然后做其他事情。
问题在于,当我点击super.paintComponent(g)
时,会显示前2条消息,其中显示MiniPanel
或placeX()
和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();
}