Swing Repeated перекрашивает мерцание JComboBox
У меня проблемы с анимацией и JComboBox. В моем приложении я могу перемещать и преобразовывать свои фигуры, используя мышь и клавиатуру, или устанавливая анимацию.
Моя иерархия компонентов выглядит следующим образом: JPanel, помещенный в мой JFrame, содержит панель с именем EditorCanvas, где формы изменяются и рисуются, и панель с именем DrawMenu, содержащую некоторые JButton и мой JComboBox.
JFrame -> JPanel -> EditorCanvas
JFrame -> JPanel -> DrawMenu -> JComboBox
JComboBox используется для выбора формы, которая будет добавлена на холст одним щелчком мыши. В другой теме я вызываю repaint() на холсте каждые 10 мс после вычисления новых позиций и т. Д.
Проблема в том, что я больше не могу использовать свой JComboBox, так как всплывающее окно исчезает сразу после его открытия. И это вызвано в какой-то момент моими перекрасами. Что действительно странно, так это то, что мой JComboBox размещен на другой панели, поэтому его не нужно перекрашивать.
Я попытался заменить мои вызовы перерисовки в Runnable, вызываемом SwingUtilities.invokeLater, но проблема осталась прежней.
Вот некоторые важные части моего кода:
public class EditorCanvas extends JPanel implements MouseListener, MouseMotionListener, KeyListener {
...
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
// To keep keyboard focus
this.requestFocusInWindow();
this.graphics = (Graphics2D) g.create();
this.graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
this.mainRenderer.paintAll(this.graphics);
}
public class AnimationManager implements Runnable {
...
public void run () {
try {
while (Thread.currentThread() == this.thread) {
// Update time values
double curTime = System.currentTimeMillis();
double deltaTime = curTime - this.lastTime;
this.lastTime = curTime;
for (Animation anim : this.animations) {
anim.update(deltaTime);
}
SwingUtilities.invokeLater(new Runnable() {
public @Override void run() {
EditorParameters.getCanvas().repaint();
}
});
// Pause the animation if it has to
synchronized (this) {
while (this.pause) {
System.out.println("\nAnimation paused!\n");
this.wait();
}
}
Thread.sleep(SLEEP_TIME);
}
1 ответ
Проблема в том, что я больше не могу использовать свой JComboBox, так как всплывающее окно исчезает немедленно
Метод рисования только для рисования.
this.requestFocusInWindow();
Вы никогда не должны вызывать такой метод в методе рисования.
Я даже не знаю, зачем вам кастомная панель. Вы не должны ссылаться на paintAll()
метод другого компонента. Swing позаботится о покраске всех дочерних компонентов панели.