在paintComponent()中调用repaint()使用的CPU过多

时间:2013-05-31 00:00:22

标签: java swing repaint paintcomponent jviewport

嗨,所以最近我想在Java中创建自己的界面,讨厌Windows滚动条(我正在添加一个JList)。所以我决定模仿Facebook的滚动条(自从我遇到这个问题后还没有完成)。

所以问题基本上就是标题。因此,当我在paintComponent()中调用repaint()时,我看到我的CPU使用率急剧上升为一个简单的接口。但我发现有必要这样做,否则我的滚动条不会被重绘。

我的CPU是i7 3770,程序使用的是15%,这不是很多,但它的功能却非常多。但是当我不调用repaint()时,它使用了大约1%,这就是我想要的。

所以这是我的paintComponent()代码:

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    if (pane.getViewport().getViewRect().getSize().equals(getSize())) return;
    double percentageScrolled = (double) pane.getVerticalScrollBar().getValue() / (pane.getVerticalScrollBar().getMaximum() - pane.getVerticalScrollBar().getModel().getExtent());
    int x = pane.getBounds().width - 11, y = pane.getViewport().getViewPosition().y + 3 + ((int) ((pane.getBounds().height - SCROLL_BAR.getHeight(null) - 9) * percentageScrolled));
    repaint(pane.getViewport().getViewRect());
    g.drawImage(SCROLL_BAR, x, y, null);
}

及以下是我不调用repaint()

时视频的链接

https://www.youtube.com/watch?v=OMXVB7REFHk&feature=youtu.be

因此,当我滚动时,我必须点击选项/值来重新绘制滚动条。

1 个答案:

答案 0 :(得分:2)

repaint(pane.getViewport().getViewRect());长期以来导致paintComponent一次又一次又一次又一次又一次又一次又一次又一次又一次又一次又一次地被召唤。一次又一次又一次又一次又一次......

我认为你明白了......

更好的想法是替换滚动窗格UI委托。

查看Modifying the Look and Feel