Java Repaint на MouseMoved вызывает отставание - PullRequest
0 голосов
/ 31 октября 2010

Я пытаюсь перерисовать мое java-приложение каждый раз, когда мышь перемещают для обновления экрана, когда пользователь перемещается по диаграмме (-> отображать имя диаграммы) и когда пользователь не перемещается подиаграмма (-> не отображать название диаграммы).Но это вызывает огромную задержку при запуске приложения (я вижу, что экран перекрашивался очень медленно, он запаздывает, каждый раз перед тем, как перекрашивать, экран становится пустым в течение секунды; перерисовка занимает много времени).части кода, о которых идет речь:

 public void mouseMoved(MouseEvent e) {
  this.checkDiagramHovered(e.getX(),e.getY());
 }

, который вызывает функцию, которая проверяет, была ли отображена диаграмма, и задает переменные, была ли отображена диаграмма, и если да, то какая диаграмма находиласьотобразить положение x и y), а затем перекрасить приложение.Таким образом, оно в основном перерисовывает приложение каждый раз, когда выполняется движение мыши, чтобы убедиться, что оно отображает имя диаграммы ТОЛЬКО при перемещении пользователя по нему.Но из-за этого экран сильно запаздывает, перекрашивается с перебоями.

Теперь мне стало интересно: как лучше это решить?Должен ли я реализовать какую-то задержку для проверки движения мыши или что-то еще, если это можно сделать?

Заранее спасибо,

Skyfe.

Ответы [ 3 ]

1 голос
/ 31 октября 2010

Я предполагаю, что вы используете Java Swing.

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

public void mouseMoved(MouseEvent e) {
   Thread thread = new Thread(new Runnable()
       public void run() {
           this.checkDiagramHovered(e.getX(),e.getY());
       }
    );
    thread.start();
}

Если checkDiagramedHovered имеет какие-либо методы пользовательского интерфейса, вам необходимо запустить их в потоке пользовательского интерфейса.

SwingUtilities.invokeLater(new Runnable()
    public void run() {
        (UI method call)
    }
);
0 голосов
/ 31 октября 2010

в разгаре и awt, все события (мышь, клавиатура) и рисование происходят в одном потоке.когда вы вызываете repaint, вы отправляете в этот поток новую работу, которая в конце концов вызовет paint.если функция рисования занимает слишком много времени, этот поток (поток очереди событий AWT) становится слишком занятым для обработки событий мыши, и вы видите лаг.описанная вами проблема мерцания также предполагает медленную функцию рисования.

Есть несколько вещей, которые вы можете сделать: 1. использовать двойную буферизацию.это решит мерцание, но не отставание.2. Выполните фактический рендеринг в другом потоке, и пусть поток awt нарисует закадровое изображение, подготовленное этим потоком.это решит обе проблемы.

короче говоря, двойная буферизация означает, что вы создаете закадровое изображение и рисуете его, а затем рисуете все изображение сразу, используя Graphics.drawImage ()

0 голосов
/ 31 октября 2010

Ну, я бы использовал Swing, а не AWT.Swing - это расширение AWT, которым сегодня пользуются все.Тогда вы можете использовать Tool Tip .Вам нужно переопределить метод getToolTipText (...) для компонента, который отображает изображение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...