2013-05-31 72 views
0

嗨,所以最近我想在Java中創建自己的接口並討厭Windows滾動條(我添加了JList)。所以我決定模仿Facebook的滾動條(因爲遇到這個問題還沒有完成)。在paintComponent()中調用repaint()使用的CPU太多

所以問題基本上就是標題。因此,當我在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); 
} 

以下是發生了什麼視頻的鏈接時,我不叫重繪()

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

所以在該視頻當我滾動時,我必須點擊選項/值來重新繪製滾動條。

+0

您已經在重新粉刷。當你做這個時,你不需要再要求塗料。 – EJP

回答

2

repaint(pane.getViewport().getViewRect());導致,在一個長約的方式,paintComponent被調用,一遍又一遍又一遍又一遍又一遍又一遍又一遍又一遍又一遍一次又一次,再而三....

我想你明白了吧...

一個更好的想法是,以取代滾動窗格UI委託來代替。

看看Modifying the Look and Feel

+0

是的,我有一種感覺是這個問題,但我試圖通過源代碼重繪,我找不到任何使paintComponent一次又一次被調用。 Tbh我寧願不編輯LookAndFeel是否還有其他解決方法?謝謝 – user2089825

+0

'repaint'向'RepaintManager'發出請求,它負責將重新計劃重新映射回EDT。因爲這些被推入到隊列中以後處理,所以這可以避免堆棧溢出問題,但會導致一個令人討厭的回調循環...查看[在AWT和Swing中繪畫](http://www.oracle.com/technetwork/java /painting-140037.html)以獲取更多詳細信息... – MadProgrammer

+0

repaint()*通過向隊列發佈PAINT事件來請求重繪。 「解決方法」不是執行冗餘重繪()。 – EJP