【问题标题】:double buffering and paint双缓冲和油漆
【发布时间】:2013-06-05 09:22:29
【问题描述】:

我同时使用了似乎有冲突的双缓冲和 Swing 事件。我正在使用 JSlider 并尝试加倍缓冲。它实际上进行了双缓冲绘制,但双缓冲再次绘制,我失去了我的形象。我正在使用 JSlider 进行双缓冲绘制,并且事件系统似乎重新绘制了框架(带有 2 个组件,一个图像和滑块)。我该如何以正确的方式做到这一点?我尝试设置一个重绘变量来表示不在组件中重绘,但这不起作用。是否有某种事件开关来停止重新绘制某些组件?我不应该使用双缓冲吗? 这是一个代码 sn-p。

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);
    }
}

。 . .

【问题讨论】:

  • 如需尽快获得更好的帮助,请发帖SSCCE

标签: java swing mouseevent double-buffering


【解决方案1】:

Swing 是 easily 通过 setDoubleBuffered(true) 双缓冲的,如果这就是您想要实现的全部。双缓冲没有什么问题,它只是使用更多的内存,在你的swingcomponents的父容器上调用它。您无法控制repaint,除非您在 JFrame 上调用 setIgnoreRepaint,否则操作系统会在认为必要时调用它。

【讨论】:

  • 我以为所有 JComponent 子组件默认设置为 true。
  • Swing 组件从父容器继承双缓冲。因为默认情况下,根窗格是双缓冲的,所以所有组件都是双缓冲的。
  • 那时我的信息已经过时了,但应该知道,从未注意到摆动组件上有任何闪烁。
猜你喜欢
  • 2013-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-27
  • 1970-01-01
  • 2014-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多