2009-09-11 3 views
1

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

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

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

+1

Почему вы не обновили свой первоначальный пост? - http://stackoverflow.com/questions/1392664/scroll-bar-problems-in-java-layered-panes/1393237#1393237 – Nate

ответ

0

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

Вы должны DoubleBuffer кадр:

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

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

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

+0

Что я могу установить? – vondip

+0

Любой компонент, содержащий компоненты, которые мерцают. Например, scrollpane или Frame, который содержит его. – Nat

+0

doubleBuffering включен по умолчанию - вызов этого не будет иметь никакого эффекта. – Nate

0

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

class MyPanel extends JPanel { 


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

    ... 
} 
+0

ну, я делаю это, но так как у меня есть как jpanel, так и большое изображение в полосах прокрутки, когда я пытаюсь переместить их свои полосы прокрутки, я получаю мерцание. Как я могу избежать этого? – vondip

+0

Я уверен, что если вы построите изображение в другом месте, (BufferedImage myImage в примере) _before_ вызывает g.drawImage, он не будет мерцать. Я подозреваю, что вы можете в настоящее время создавать свой образ в методе рисования, возможно, последовательно используя разные методы объекта Graphics; он будет мерцать точно. –

Смежные вопросы