Как мне заставить paintComponent(Graphics g) вызывать? repaint() не будет работать каждый раз

Следующее в программе Java SE6, которая представляет собой игру Tic Tac Toe:

У меня есть класс MiniPanel это расширяет JPanel что у меня в сетке. Если пользователь щелкает один из них, слушатель делает что-то, а затем... в конце концов, он вызывает метод placeX() или placeO() на минипанели, по которой щелкнули. Это делает некоторые вещи, а затем распечатывает сообщение о том, что метод был вызван, и уже в следующей строке вызывается метод animatePanel(), который вызывает метод repaint() внутри, распечатывая сообщение прямо перед этим.

Класс MiniPanel также переопределяет paintComponent(Graphics g) с методом, который сначала выводит сообщение о том, что paintComponent был вызван, ТО делает super.paintComponent(g) а затем делает другие вещи.

Проблема в том, что когда я нажимаю MiniPanel, первые 2 сообщения о том, что placeX() или же placeO() и animatePanel() был вызван появляется, что означает, что repaint() Должно быть, был вызван. Но paintComponent(Graphics g) никогда не называется! Еще одна странная вещь, что это работает, если я позвоню placeX() непосредственно когда MiniPanel инициализируется, но не иначе.

у меня есть только paintComponent(Graphics g) переопределено, больше ничего.

Вот краска компонент:

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

0 ответов

Другие вопросы по тегам