JPanel перекрашивается при изменении размера JFrame, хотя он не скрыт и не изменен

Я тестировал игру, которую я пишу, когда обнаружил, что один из JPanels внутри JSplitPane перекрашивался при изменении размера JFrame, даже если его область не была затемнена и не была изменена.

Хотя логику (точнее, счетчики) никогда не следует помещать в метод paintComponent, она вызывает потенциально серьезные проблемы.

Кто-нибудь сталкивался / заметил это поведение? Я прочитал один из способов предотвращения перекрашивания - использовать RepaintManager.markCompletlyClean(JComponent). Любые предложения / обходные пути, кроме RepaintManager? Это ошибка?

Увидеть ниже:

import java.awt.*;
import javax.swing.*;

class test
{
    public static void main(String args[])
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                JFrame jframe = new JFrame();
                jframe.setLocation(100,100);
                jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                JPanel jpanel1 = new JPanel()
                {
                    final static long serialVersionUID = 0;

                    int int_repaints = 0;

                    public void paintComponent(Graphics graphics)
                    {
                        System.out.println("repainting jpanel1=" + (int_repaints++));
                    }

                    public Dimension getPreferredSize()
                    {
                        return new Dimension(300,300);
                    }
                };

                JPanel jpanel2 = new JPanel()
                {
                    final static long serialVersionUID = 0;

                    int int_repaints = 0;

                    public void paintComponent(Graphics graphics)
                    {
                        System.out.println("repainting jpanel2=" + (int_repaints++));
                    }

                    public Dimension getPreferredSize()
                    {
                        return new Dimension(300,300);
                    }
                };

                JSplitPane jsplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,jpanel1,jpanel2);

                jframe.setContentPane(jsplitPane);
                jframe.pack();
                jframe.setVisible(true);
            }
        });
    }
}

0 ответов

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