Java Swing - мерцающая графика Canvas - PullRequest
3 голосов
/ 07 декабря 2011

Мне нужно написать простое приложение на Java, которое может загружать картинки, показывать их в форме графического интерфейса, разрешать пользователю применять некоторые преобразования и показывать преобразованную картинку.Мое решение работает нормально, но пользовательский интерфейс немного мерцает, потому что метод перерисовки вызывается слишком часто (например, когда пользователь масштабирует изображение с помощью JSlider)

Мой код выглядит следующим образом:

public class ImageCanvas extends Canvas
{
    private BufferedImage image;
    // ...

    @Override
    public void paint(Graphics g) 
    {
        Graphics2D g2d = (Graphics2D) g;
        if(image != null)
        {
             // I draw out the image...
        }
    }

    public void setImage(BufferedImage image)
    {
        this.image = image;
        this.repaint();
    }

    public void setRotation(double rotation)
    {
        this.rotation = rotation;
        this.repaint();
    }

    public void setScale(double scaleX, double scaleY) 
    { 
       //set the scaling field, then repaint ....
    }    

    // and so on...
}

И, конечно же, у меня есть главный элемент управления ImageCanvas в моем основном пользовательском интерфейсе, и я просто вызываю открытые методы (см., Например, метод "setRotation" выше), которые перерисовывают область холста.Я знаю, что это простой вопрос, но я даже не нахожу свойство DoubleBuffered на Canvas ...

Любая помощь приветствуется.

Ответы [ 3 ]

7 голосов
/ 07 декабря 2011

Двойная буферизация встроена для классов Swing (т.е. производных от JComponent).

Если вы хотите встроенную двойную буферизацию, вы должны расширить JPanel, а не Canvas и переопределить paintComponent, а не paint.

1 голос
/ 07 декабря 2011

Если вы можете использовать JPanel, чем идти на это. Убедитесь, что вы не переопределяете метод JPanel.paint, вместо этого переопределите JPanel.paintComponent См. ссылку для деталей.

0 голосов
/ 07 декабря 2011

Обычно графические лаги в этих приложениях могут быть вызваны установкой пустой переменной в верхней части скрипта, затем изменением ее значения и ожиданием перерисовки для его обновления. Вы можете попробовать изменить:

    setRotation(double rotation);

, чтобы повернуть изображение в этом методе.

Просто общее, что я вижу при работе с графикой.

...