Swing: объединяет ли DefaultBoundedRangeModel несколько событий? - PullRequest
0 голосов
/ 17 июня 2010

У меня есть 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();
    }
}

1 Ответ

1 голос
/ 17 июня 2010

См. Вложенный класс DoPostEvent в классе javax.swing.Timer и комментарии к полю notify.

Добавление: события из DefaultBoundedRangeModel пересылаются делегату пользовательского интерфейса с помощью fireStateChanged() метода JProgressBar. События объединяются в EventQueue, когда postEvent() вызывается repaint().

Один из способов следовать по следу - установить точку останова в методе paint() делегата пользовательского интерфейса и проверить стек вызовов.

JProgressBar jpb = new JProgressBar(brm);
jpb.setUI(new BasicProgressBarUI());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...