2016-05-11 2 views
-1

У меня проблема, когда моя JPanel не обновляется должным образом с использованием repaint().JPanel не перерисовывается при вызове repaint() из производного класса

У меня есть основной класс GUI, который добавляет JPanel к кадру. Вот класс JPanel.

public class GUI extends JFrame { 
    ... 
    setContentPane(new MazeMonkey()); 
    ... 
} 

Это мой класс JPanel.

public class MazeMonkey extends JPanel { 
    ... 
    repaint();   // this works 
    ... 

    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     m.display(g);           // redraw the maze 
    } 
} 

Если я переписываю этот класс, он отлично работает! Однако, если я вызываю перерисовку из класса, который расширяет MazeMonkey, это не так. Например,

public class TimeTrial extends MazeMonkey implements Runnable { 
    public void nextMaze() { 
     setBackground(Color.WHITE); 
     repaint();     // this does not work 
     revalidate(); 
    } 
} 

Это не работает. Я добавил заявление println внутри paintComponent, чтобы проверить, вызвано ли оно вызовом, и оно есть. Однако он не обновляет панель! Может ли кто-нибудь помочь мне, пожалуйста?

Спасибо.

+1

Прежде всего перепроверить() и repaint() не требуется, поскольку, когда вы изменяете свойство компонента (т.е. setBackground (...)), Swing будет ссылаться на эти методы для вас. 'если он вызван и он есть. '- тогда я бы сказал, что проблема в вашей логике m.display (...). – camickr

+2

Опубликовать [SSCCE] (http://sscce.org/), демонстрируя проблему. Опять же, нам не нужно ваше настоящее приложение. Просто пример, имитирующий проблему. Таким образом, у вас есть рамка с панелью TimeTrial, которую вы добавляете в фрейм. В вашем опубликованном коде вы добавляете MazMonkey в фрейм, но нигде вы не добавляете TimeTrial к кадру. Коду рисования не нужно рисовать лабиринт, только сделать drawstring (...), чтобы доказать, что метод вызывается. Держите код простым. Легче отлаживать простой код. – camickr

+0

Нам нужны ваши коды, чтобы помочь вам – ziLk

ответ

0

Есть две вещи, которые я бы изменить здесь:

  1. revalidate + repaint должен работать в AWT потоке.
  2. Я обычно запустить revalidate и repaint в таком порядке - но не могу вспомнить, почему я так :)

Так вот расширенный код:

public class TimeTrial extends MazeMonkey implements Runnable { 
    public void nextMaze() { 
     SwingUtilities.invokeLater(new Runnable() { // so it runs in the right Thread 
      @Override 
      public void run() { 
       setBackground(Color.WHITE); 
       revalidate(); // this comes first 
       repaint(); // this should work now 
      } 

     }); 
    } 
} 
+0

К сожалению, панель по-прежнему не перерисовывается. Я думал, что позже он сделает это: / – Nic