Список в JScrollPane живописи вне видового экрана

голоса
3

У меня есть список, каждый элемент которого имеет несколько вещей в нем, в том числе , JProgressBarкоторые могут обновлять много. Каждый раз , когда один из элементов обновляет его JProgressBar, то ListDataListenerв списке пытается прокрутить его видимый диапазон использования

/*
 * This makes the updating content item automatically scroll
 * into view if it is off the viewport.
 */
public void contentsChanged(final ListDataEvent evt) {
    if (!EventQueue.isDispatchThread()) {
        /**
          * Make sure the scrolling happens in the graphics dispatch thread.
          */
        EventQueue.invokeLater(new Runnable() {
            public void run()  {
               contentsChanged(evt);
            }
        });
    }
    if (playbackInProgress) {
        int index = evt.getIndex0();
        currentContentList.ensureIndexIsVisible(index);
    }
}

Обратите внимание , что я пытаюсь убедиться , что прокрутка выполняется в диспетчерском потоке, так как я думал , может быть проблема была это время прокручивается в то время как это было перекрашивать. И тем не менее, я до сих пор есть проблемы , где , если вещи действительно активны, некоторые из элементов списка расписывать вне видового экрана, перезапись что за пределами JScrollPane. Принуждение события экспозиции будет перекрашивать эти вещи, но это раздражает.

Есть ли что-нибудь еще мне нужно высматривать, чтобы остановить эти вещи малярных вне их подрезки области?

Задан 28/08/2008 в 16:08
источник пользователем
На других языках...                            


1 ответов

голоса
3

Пытались ли вы явно включение двойной буферизации на JList и / или компонентов , которые он рисует поверх? (с: setDoubleBuffered(boolean aFlag))

Еще одна мысль, что вы , возможно , потребуется , чтобы выйти из функции сразу после делегирования в EDT. Путь ваш код написан, он выглядит как обновление будет происходить в обоих потоков , если ContentChangedвызывается из потока без EDT. Вход в первом if(или установить точку останова в случае , - но не в работоспособном - должно помочь определить , если это ваша проблема.

например:

public void contentsChanged(final ListDataEvent evt)
{
    if (!EventQueue.isDispatchThread())
    {
        log.debug("Delegating contentsChanged(...) to EDT");

        EventQueue.invokeLater(new Runnable() 
        {
            public void run() 
            {
                contentsChanged(evt);
            }
        });
        // don't run ensureIndexIsVisible twice:
        return;
     }

     if (playbackInProgress)
     {
         int index = evt.getIndex0();
         currentContentList.ensureIndexIsVisible(index);
     }
}
Ответил 28/08/2008 в 17:17
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more