我是一名初级java程序员,上周我遇到了以下问题:我有一个图像和一个面板。图像和面板都位于 ScrollPane 内,并且它们都需要同时移动。当我尝试将它们移动到一起时,我得到了闪烁的效果。不过,单独移动它们每个都效果很好。我读过有关双缓冲的内容并决定实现它。我的问题是我的图像非常非常大,因此每次从头开始绘制都会导致我的应用程序卡住。所以我一直在考虑以下解决方案:
在我的绘画功能中,我将推进大图像的滚动条(工作正常),从我现在更新的图形内容中绘制一个新图像并在其上绘制我的面板内容。
尽管我在网上搜索了很多,但我找不到如何操作的解释。简而言之,我如何使用当前的 Graphic 对象从中绘制图像?
我认为您在代码中的某处对 Paint 方法进行了覆盖。
你必须对帧进行双缓冲:
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();
您可以创建一个扩展某些 JComponent(如 JPanel)的面板并覆盖其绘制方法。像这样的东西:
class MyPanel extends JPanel {
@override
public void paint(Graphics g) {
g.drawImage(myImage, 0, 0, null);
}
...
}
据我所知,你不必手动实现双缓冲。据我所知,这里有一个属性(例如 setDoubleBuffered(true))来激活双缓冲。