private void updatePointerRect() {
   if (seq == null || seq.getLength() == 0) {
     ptrRect.x = 0;
   } else {
     ptrRect.x = (int) (getWidth() * seq.getThumbPosition() / seq.getLength() - PTR_WIDTH / 2);
   }
 }
  @Override
  protected void paintComponent(Graphics g) {
    super.paintComponent(g);

    Graphics2D g2 = (Graphics2D) g;
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

    int ptrPos;
    if (seq == null || seq.getLength() == 0) {
      ptrPos = 0;
    } else {
      ptrPos =
          (int) (SIDE_PAD + (getWidth() - 2 * SIDE_PAD) * seq.getThumbPosition() / seq.getLength());
    }

    final int x = SIDE_PAD;
    final int y = (PTR_HEIGHT - BAR_HEIGHT) / 2;
    int right = getWidth() - SIDE_PAD;

    g2.setClip(new RoundRectangle2D.Float(x, y, right - x, BAR_HEIGHT, ROUND, ROUND));
    g2.setPaint(new GradientPaint(0, y, Color.DARK_GRAY, 0, y + BAR_HEIGHT, Color.GRAY));
    g2.fillRect(x, y, ptrPos - x, BAR_HEIGHT);

    g2.setPaint(new GradientPaint(0, y, Color.LIGHT_GRAY, 0, y + BAR_HEIGHT, Color.WHITE));
    g2.fillRect(ptrPos, y, right - ptrPos, BAR_HEIGHT);
    g2.setClip(null);

    g2.setColor(Color.BLACK);
    g2.drawRoundRect(x, y, right - x - 1, BAR_HEIGHT, ROUND, ROUND);

    if ((mouseHovering || seq.isDragging()) && this.isEnabled()) {
      int left = ptrPos - PTR_WIDTH / 2;

      final Color PTR_COLOR_1 = Color.WHITE;
      final Color PTR_COLOR_2 = Color.LIGHT_GRAY;

      g2.setPaint(new GradientPaint(left, 0, PTR_COLOR_1, left + PTR_WIDTH, 0, PTR_COLOR_2));
      g2.fillOval(left, 0, PTR_WIDTH, PTR_HEIGHT);
      g2.setColor(Color.BLACK);
      g2.drawOval(left, 0, PTR_WIDTH - 1, PTR_HEIGHT - 1);
    }
  }
  public PlayControlPanel(
      SequencerWrapper seq, String playIconName, String pauseIconName, String stopIconName) {
    super(
        new TableLayout(
            new double[] {4, 0.50, PREFERRED, PREFERRED, 0.50, 4, PREFERRED, 4},
            new double[] {4, PREFERRED, 4, PREFERRED, 4}));

    this.sequencer = seq;

    this.playIcon = new ImageIcon(IconLoader.class.getResource(playIconName + ".png"));
    this.pauseIcon = new ImageIcon(IconLoader.class.getResource(pauseIconName + ".png"));
    Icon stopIcon = new ImageIcon(IconLoader.class.getResource(stopIconName + ".png"));

    songPositionBar = new SongPositionBar(seq);
    songPositionLabel = new SongPositionLabel(seq);

    playButton = new JButton(playIcon);
    playButton.addActionListener(
        new ActionListener() {
          public void actionPerformed(ActionEvent e) {
            sequencer.setRunning(!sequencer.isRunning());
          }
        });

    stopButton = new JButton(stopIcon);
    stopButton.addActionListener(
        new ActionListener() {
          public void actionPerformed(ActionEvent e) {
            sequencer.reset(false);
          }
        });

    sequencer.addChangeListener(
        new SequencerListener() {
          public void propertyChanged(SequencerEvent evt) {
            updateButtonStates();
          }
        });

    updateButtonStates();

    add(songPositionBar, "1, 1, 4, 1");
    add(songPositionLabel, "6, 1");
    add(playButton, "2, 3");
    add(stopButton, "3, 3");
  }
 private void updateButtonStates() {
   playButton.setIcon(sequencer.isRunning() ? pauseIcon : playIcon);
   playButton.setEnabled(sequencer.isLoaded());
   stopButton.setEnabled(
       sequencer.isLoaded() && (sequencer.isRunning() || sequencer.getPosition() != 0));
 }