Java Swing How to - Add JProgressBar in a JTabbedPane tab title








Question

We would like to know how to add JProgressBar in a JTabbedPane tab title.

Answer

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
/*from www .j a  v a2s.c om*/
import javax.swing.Icon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.Timer;

public class Main {
  static JTabbedPane jtp = new JTabbedPane();

  public static void main(String[] args) {
    JFrame f = new JFrame();
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    jtp.setPreferredSize(new Dimension(400, 200));
    createTab("Reds", Color.RED);
    f.add(jtp, BorderLayout.CENTER);
    f.pack();
    f.setVisible(true);
  }
  private static void createTab(String name, Color color) {
    ProgressIcon icon = new ProgressIcon(color);
    jtp.addTab(name, icon, new ColorPanel(jtp, icon));
  }
}

class ColorPanel extends JPanel implements ActionListener {
  Random rnd = new Random();
  Timer timer = new Timer(1000, this);
  JLabel label = new JLabel("OK!");
  JTabbedPane parent;
  ProgressIcon icon;
  int mask;
  int count;

  public ColorPanel(JTabbedPane parent, ProgressIcon icon) {
    super(true);
    this.parent = parent;
    this.icon = icon;
    this.mask = icon.color.getRGB();
    this.setBackground(icon.color);
    label.setForeground(icon.color);
    this.add(label);
    timer.start();
  }

  public void actionPerformed(ActionEvent e) {
    this.setBackground(new Color(rnd.nextInt() & mask));
    this.icon.update(count += rnd.nextInt(8));
    this.parent.repaint();
  }
}

class ProgressIcon implements Icon {
  int H = 16;
  int W = 3 * H;
  Color color;
  int w;

  public ProgressIcon(Color color) {
    this.color = color;
  }

  public void update(int i) {
    w = i % W;
  }

  public void paintIcon(Component c, Graphics g, int x, int y) {
    g.setColor(color);
    g.fillRect(x, y, w, H);
  }

  public int getIconWidth() {
    return W;
  }

  public int getIconHeight() {
    return H;
  }
}