2013-05-31 4 views
0

Привет, недавно я хотел создать свой собственный интерфейс на Java и ненавидел полосу прокрутки Windows (я добавлял JList). Поэтому я решил подражать полосам прокрутки Facebook (еще не закончен, так как я столкнулся с этой проблемой).Вызов repaint() в paintComponent() использует слишком много CPU

Таким образом, проблема заключается в основном в названии. Поэтому в значительной степени я видел, как мое использование процессора резко увеличилось для простого интерфейса, когда я назвал repaint() в paintComponent(). Но я обнаружил, что это необходимо сделать, иначе мой полоса прокрутки не будет перерисована.

Мой процессор - 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 называть снова и снова и снова и снова и снова и снова и снова и снова и снова и снова и снова и снова и снова и снова и снова и снова и снова и снова и снова и снова и снова и снова и снова ....

Я думаю, вы получите точку ...

Лучшей идеи была бы вместо того, чтобы заменить панели прокрутки интерфейса делегата.

Посмотрите на Modifying the Look and Feel

+0

Да, у меня было ощущение, что это проблема, но я попытался просмотреть исходный код для перерисовки, и я не смог найти ничего, что заставило paintComponent быть вызвано снова и снова. Tbh Я бы предпочел не редактировать LookAndFeel, есть ли другая работа? Спасибо – user2089825

+0

'repaint' делает запрос' RepaintManager', который отвечает за планирование repaints обратно в EDT. Поскольку они помещаются в очередь для последующей обработки, это предотвращает проблемы с переполнением стека, но вызывает неприятный цикл обратного вызова ... Проверьте [Живопись в AWT и Swing] (http://www.oracle.com/technetwork/java /painting-140037.html) для получения более подробной информации ... – MadProgrammer

+0

repaint() * request * repaint, отправив событие PAINT в очередь. «Обходной путь» - это не делать избыточную перерисовку(). – EJP

Смежные вопросы