双缓冲和油漆

时间:2013-06-09 16:31:51

标签: java swing mouseevent double-buffering

我正在使用双缓冲和Swing事件,这似乎是冲突的。我正在使用JSlider并试图加倍缓冲。它实际上是双缓冲绘制,但双缓冲再次绘制,我失去了我的形象。我正在使用JSlider进行双缓冲绘制,事件系统似乎重新绘制框架(包含2个组件,图像和滑块)。我该怎么做正确的方法?我已经尝试设置一个重绘变量来表示不在组件中重新绘制,但这不起作用。是否有某种事件切换来停止重新绘制某些组件?我不应该使用双缓冲吗? 这是一段代码片段。

private void drawOneByOne(ImageComponent imgComponent, JFrame f,
        MapObjects mapObjects, int number) {
    f.createBufferStrategy(2); 

    BufferStrategy bufferStrategy = f.getBufferStrategy();
    Graphics2D g = (Graphics2D)bufferStrategy.getDrawGraphics();            
    bufferStrategy = f.getBufferStrategy();
    g = (Graphics2D)bufferStrategy.getDrawGraphics();
    // draw the map and then the points
    imgComponent.paint(g);
    for (int i = 0; i < number; i++) {
        imgComponent.drawPoint(mapObjects.get(i),g);
    }
    imgComponent.repaint = false;
    bufferStrategy.show();
    g.dispose();
    imgComponent.repaint = true;
}
public void stateChanged(ChangeEvent e) {
    JSlider source = (JSlider)e.getSource();
    if (!source.getValueIsAdjusting()) {
        int voterNumber = source.getValue();
        System.out.println("Drawing One By One, " + voterNumber);
        drawOneByOne(this.imgComponent, this.f, this.mapObjects, voterNumber);
    }
}

。 。

1 个答案:

答案 0 :(得分:0)

如果您希望实现这一目标,则通过setDoubleBuffered(true)进行easily双重缓冲。双缓冲没有任何问题,它只是使用更多的内存,在你的swing组件的父容器上调用它。您无法控制repaint,操作系统会在认为必要时调用它,除非您在JFrame上调用setIgnoreRepaint