Java: как заставить полосу прокрутки прокручиваться с постоянной скоростью?

Я хочу сделать программу с графическим интерфейсом Java. он содержит jScrollpane, который содержит большую панель jPanel. сама jPanel содержит множество компонентов Swing, таких как jButtons, jPanels и... что я хочу, так это то, что когда пользователь нажимает на jButton, jScrollpane начинает прокручиваться до конца большой панели с постоянной скоростью. что-то вроде ОС Android. как я знаю, я должен знать, как сделать анимацию с помощью java, чтобы решить эту проблему, я пытался решить это просто с помощью потоков, но это невозможно, и кажется, что свинг требует более конкретного использования потоков... не могли бы вы дать мне свой идеи? это связано с Swingworker? действительно очень критично... :(

Обновление: я попытался решить это с помощью класса таймера:

       ActionListener action = new ActionListener()
    {
        @Override
        public void actionPerformed(ActionEvent e)
        {
            if (mainContainerScrollPane.getHorizontalScrollBar().getValue() == mainContainerScrollPane.getHorizontalScrollBar().getMaximum())
                timer.stop();
            mainContainerScrollPane.getHorizontalScrollBar().setValue(mainContainerScrollPane.getHorizontalScrollBar().getValue() + 5);
            mainContainerScrollPane.repaint();
        }
    };

    timer = new Timer(10, action);
    timer.start();

проблема сейчас в том, что анимация не сделана плавно. я имею в виду, что он плавно прокручивается, но когда он достигает определенного места, его скорость снижается. Зачем?


person SAndroid    schedule 05.01.2013    source источник


Ответы (1)


Вообще говоря, любое событие, которое изменяет компонент графического интерфейса, должно запускаться в потоке диспетчеризации событий (EDT). Вы можете использовать качание Timer для запуска повторяющихся событий в EDT, как описано в этом руководстве. http://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html. В событии таймера вы можете увеличить значение полосы прокрутки до любой новой позиции. Повторите это с тем же шагом, чтобы получить желаемый эффект.

person Jeff Storey    schedule 05.01.2013
comment
есть только одна проблема, о чем я сказал в обновлении... откуда эта проблема? - person SAndroid; 06.01.2013
comment
Возможно, он не успевает за таймером на 10 мс. Попробуйте немного замедлить таймер. также обязательно проверьте значение, превышающее или равное максимальному значению, если максимальное значение не является приращением 5 - person Jeff Storey; 06.01.2013
comment
да, проблема была решена, когда я изменил 10 на 100. но это НЕ то, что я хочу, так как это не делает анимацию такой быстрой, как я хочу. Я тоже не могу каждый раз увеличивать добавленное значение к значению полосы прокрутки. так как это не делает анимацию гладкой. Я не знаком с SwingWworker... может ли это решить проблему? если нет, то, пожалуйста, дайте мне свои замечательные идеи, друг :) спасибо - person SAndroid; 07.01.2013
comment
Попробуйте разные значения от 10 до 100. Кроме того, вместо того, чтобы вызывать getHorizontalScrollbar и getMaxValue каждый раз в actionPerformed, получите эти значения один раз вне цикла. SwingWorker тут не поможет. Он предназначен для выполнения длительных фоновых задач. - person Jeff Storey; 07.01.2013
comment
теперь стало лучше! спасибо но почему, почему таймер ограничивает нас в выборе времени задержки? - person SAndroid; 08.01.2013
comment
Таймер не ограничивает его. Просто он не мог запустить цикл достаточно быстро, чтобы не отставать от 10 мс. - person Jeff Storey; 08.01.2013
comment
так это зависит от ЦП, ОЗУ и...? и, возможно, этот таймер, например. 20 мс работает на моей машине и не работает на машине конечного пользователя? - person SAndroid; 08.01.2013
comment
Это часть этого. Сбор мусора также может вызвать некоторые сбои. Если вас действительно интересует, что занимает миллисекунды, запустите профилировщик кода. - person Jeff Storey; 08.01.2013