Java - графика к изображению - PullRequest
       25

Java - графика к изображению

1 голос
/ 11 сентября 2009

Ну, я младший Java-программист, на прошлой неделе я столкнулся со следующей проблемой: у меня есть изображение и панель. И изображение, и панель находятся внутри ScrollPane, и они оба должны двигаться одновременно. Когда я пытаюсь переместить их вместе, я получаю эффект мерцания. Перемещение каждого из них в одиночку работает нормально. Я прочитал о двойной буферизации и решил ее реализовать. Моя проблема в том, что мое изображение очень очень большое, поэтому рисование его каждый раз с нуля приводит к зависанию моего приложения. Поэтому вместо этого я подумал о следующем решении:

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

Хотя я и искал его в Интернете, я не мог найти объяснения, как это сделать. Короче говоря, как я могу использовать свой текущий графический объект, чтобы нарисовать из него изображение?

Ответы [ 3 ]

0 голосов
/ 11 сентября 2009

Вы можете создать панель, которая расширяет JComponent (например, JPanel) и переопределяет его метод рисования. Примерно так:

class MyPanel extends JPanel {


  @override
  public void paint(Graphics g) {
    g.drawImage(myImage, 0, 0, null);
  }

  ...
}
0 голосов
/ 13 сентября 2009

Я думаю, вы сделали переопределение в методе рисования где-то в вашем коде.

Вы должны удвоить кадр:

frame.setVisible(true);
frame.createBufferStrategy(2); // Two is the number of buffers
// Here is the order important: first set visible, then createStrategy

Тогда ваш метод рисования в вашем кадре: (Не переопределяйте метод)

public void updateGraphics()
{
     BufferStrategy bs = getBufferStrategy();
     Graphics g = bs.getDrawGraphics();
     paint(g);
     g.dispose();
     bs.show();
     Toolkit.getDefaultToolkit().sync();
     update(g);
}

Этот метод вы можете использовать в теме:

new Thread("PainterThread")
{
     public void run()
     {
          while (true)
          {
               try
               {
                    updateGraphics();
                    Thread.sleep(10);
               } catch (Exception e) {}
          }
     }
}.start();
0 голосов
/ 11 сентября 2009

Насколько я знаю, вам не нужно реализовывать двойную буферизацию вручную. Насколько я помню, здесь есть свойство (например, setDoubleBuffered (true)) для активации двойной буферизации.

с наилучшими пожеланиями

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...