Java: JProgressBar (o equivalente) in un titolo della scheda JTabbedPane

Se volessi davvero fare qualcosa del genere, posso inserire un JProgressBar (o è equivalente) in una scheda JTabbedPane? (Voglio dire, non nella scheda stessa,

Come potrei fare qualcosa del genere?

EDIT Voglio davvero mettere la barra di avanzamento nel titolo della scheda, non la scheda stessa.

Ecco alcuni ascii art:

---------------------------------------------------- | Tab 1 || Tab 2||Tab-with-progress-bar||Tab 4| ----------- -------------------------------- ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ---------------------------------------------------- 

Quindi è davvero “tab 2” che è attualmente visibile, ma voglio che la barra di avanzamento (o equivalente) sia visibile nel titolo della terza scheda.

MODIFICA 2

Questo deve funzionare su Java 1.5: questo deve funzionare sugli innumerevoli computer Apple MacOS 10.4 e MacOS 10.5 che non saranno mai dotati di Java 6 (alcuni lo fanno, altri no: e molto non lo faranno mai, non è il mio chiamata)

Racchiudere JProgressbar in un JPanel e aggiungere JPanel a JTabbedPane.

Modifica: dal JDabbedPane JavaDoc :

// In questo caso il componente personalizzato è responsabile del rendering del titolo della scheda.

 tabbedPane.addTab(null, myComponent); tabbedPane.setTabComponentAt(0, new JLabel("Tab")); 

Quindi potresti semplicemente sostituire semplicemente la new JLabel("Tab") con un riferimento alla tua JProgressbar (sebbene questa JProgressbar non debba essere aggiunta alla Tab stessa). Tuttavia, penso che questo metodo non esiste prima di Java 1.6.

Per le versioni precedenti, potresti provare addTab() con un’implementazione adatta di Icon usata per indicare lo stato di avanzamento.

JTabbedTest

 import java.awt.*; import java.awt.event.*; import java.util.Random; import javax.swing.*; public class JTabbedTest { public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { private final JTabbedPane jtp = new JTabbedPane(); public void run() { JFrame f = new JFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jtp.setPreferredSize(new Dimension(400, 200)); createTab("Reds", Color.RED); createTab("Greens", Color.GREEN); createTab("Blues", Color.BLUE); f.add(jtp, BorderLayout.CENTER); f.pack(); f.setVisible(true); } private void createTab(String name, Color color) { ProgressIcon icon = new ProgressIcon(color); jtp.addTab(name, icon, new ColorPanel(jtp, icon)); } }); } private static class ColorPanel extends JPanel implements ActionListener { private static final Random rnd = new Random(); private final Timer timer = new Timer(1000, this); private final JLabel label = new JLabel("Stackoverflow!"); private final JTabbedPane parent; private final ProgressIcon icon; private final int mask; private 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 actionPerformsd(ActionEvent e) { this.setBackground(new Color(rnd.nextInt() & mask)); this.icon.update(count += rnd.nextInt(8)); this.parent.repaint(); } } private static class ProgressIcon implements Icon { private static final int H = 16; private static final int W = 3 * H; private Color color; private 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; } } }