каким образом выполняется условия If в классе MiniMusicPlayer3?

Изучаю Java по книге Сиерры и Бейтс, 12 глава, работа с графикой. Нижеследующий код проигрывает произвольные ноты из библиотеки MidiSystem, обработчик событий ControllerEventListener через слушателя определяет начало звучания ноты и обрабатывает собственное событие, обновляя метод repaint, который заставляет рисовать произвольные прямоугольники на панели при каждом проигрывании нот.

Вопрос скорее в логической части понимании кода, а именно в одном его месте: мы объявляем переменную msg = false и ставим условие, что только при начале события (проигрывания ноты) переменной msg приравнивается значение true и, собственно, только в таком случае прямоугольники начинаются вырисовываться. Почему при запуске программы после запуска метода setUpGui, где происходит создание экземпляра класса MyDrawPanel не запускается метод paintComponent того же класса? Даже если мы пропускаем выполнение метода controlChange (событие не происходит), то выполнение метода paintComponent должно произойти, где условие переменной msg не зависит значения msg (true или false).

Пробовал поменять на if (msg = true) - вырисовывается один прямоугольник без звука, а дальше все в такт по нотам. При if (msg = false) ничего не выходит...

Разве msg может копировать значение true с метода controlChange при первом запуске MyDrawPanel, где нет проигрывания нот?

    import javax.sound.midi.*;
    import javax.swing.*;
    import java.awt.*;
    
    public class MiniMusicPlayer3 {
        static JFrame f = new JFrame("Мой первый музыкальный клип");
        static MyDrawPanel ml;
    
        public static void main(String[] args) {
            MiniMusicPlayer3 mini = new MiniMusicPlayer3();
            mini.go();
        }
    
        public void setUpGui() {
            ml = new MyDrawPanel();
            f.setContentPane(ml);
            f.setBounds(30,30,300,300);
            f.setVisible(true);
        }
    
        public void go() {
            setUpGui();
    
            try {
                Sequencer sequencer = MidiSystem.getSequencer();
                sequencer.open();
                sequencer.addControllerEventListener(ml, new int[]{127});
                Sequence seq = new Sequence(Sequence.PPQ, 4);
                Track track = seq.createTrack();
    
                int r = 0;
                for (int i = 0; i < 60; i += 4) {
                    r = (int) ((Math.random() * 50) + 1);
                    track.add(makeEvent(144, 1, r, 100, i));
                    track.add(makeEvent(176, 1, 127, 0, i));
                    track.add(makeEvent(128, 1, r, 100, i + 2));
                } // Конец цикла
    
                sequencer.setSequence(seq);
                sequencer.start();
                sequencer.setTempoInBPM(120);
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
        public MidiEvent makeEvent(int comd, int chan, int one, int two, int tick) {
            MidiEvent event = null;
            try {
                ShortMessage a = new ShortMessage();
                a.setMessage(comd, chan, one, two);
                event = new MidiEvent(a, tick);
            } catch (Exception e) {
            }
            return event;
        }
        class MyDrawPanel extends JPanel implements ControllerEventListener {
            boolean msg = false;
    
            public void controlChange(ShortMessage event) {
                msg = true;
                repaint();
            }
            public void paintComponent(Graphics g) {
                if (msg) { // какое значение принимает msg при первом запуске метода painComponent?
                    Graphics2D g2 = (Graphics2D) g;
                    int r = (int) (Math.random() * 250);
                    int gr = (int) (Math.random() * 250);
                    int b = (int) (Math.random() * 250);
                    g.setColor(new Color(r,gr,b));
                    int ht = (int) ((Math.random() * 120) + 10);
                    int width = (int) ((Math.random() * 120) + 10);
                    int x = (int) ((Math.random() * 40) + 10);
                    int y = (int) ((Math.random() * 40) + 10);
                    g.fillRect(x,y,ht,width);
                    msg = false;
                } // Закрываем if
            } // Закрываем метод
        } // Закрываем внутренний класс
    } // Закрываем класс
          

Ответы (0 шт):