У меня есть JProgressBar, отображающий модель BoundedRangeModel, которая является чрезвычайно мелкозернистой, и я был обеспокоен тем, что его слишком частое обновление может замедлить работу моего компьютера. Поэтому я написал программу быстрого тестирования (см. Ниже), которая имеет таймер 10 Гц, но каждый тик таймера делает 10000 вызовов на microtick()
, что, в свою очередь, увеличивает BoundedRangeModel. Тем не менее, похоже, что он хорошо играет с JProgressBar; мой процессор не работает изо всех сил, чтобы запустить программу.
Как JProgressBar или DefaultBoundedRangeModel делают это? Они, кажется, умны в отношении того, сколько работы нужно проделать для обновления JProgressBar, так что как пользователю я не должен беспокоиться об обновлении значения BoundedRangeModel .
package com.example.test.gui;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BoundedRangeModel;
import javax.swing.DefaultBoundedRangeModel;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.Timer;
public class BoundedRangeModelTest1 extends JFrame {
final private BoundedRangeModel brm = new DefaultBoundedRangeModel();
final private Timer timer = new Timer(100, new ActionListener()
{
@Override public void actionPerformed(ActionEvent arg0) { tick(); }
});
public BoundedRangeModelTest1(String title) {
super(title);
JPanel p = new JPanel();
p.add(new JProgressBar(this.brm));
getContentPane().add(p);
this.brm.setMaximum(1000000);
this.brm.setMinimum(0);
this.brm.setValue(0);
}
protected void tick() {
for (int i = 0; i < 10000; ++i)
{
microtick();
}
}
private void microtick() {
this.brm.setValue(this.brm.getValue()+1);
}
public void start()
{
this.timer.start();
}
static public void main(String[] args)
{
BoundedRangeModelTest1 f =
new BoundedRangeModelTest1("BoundedRangeModelTest1");
f.pack();
f.setVisible(true);
f.setDefaultCloseOperation(EXIT_ON_CLOSE);
f.start();
}
}