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 позаботится о покраске всех дочерних компонентов панели.

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