在JTabbedPane选项卡标题中的Java:JProgressBar(或等价物)

如果我真的想这样做,我可以把一个JProgressBar(或它的等价物)在JTabbedPane选项卡? (我的意思是,不是在标签本身,

我将如何做这样的事情?

编辑我真的想把进度栏的标签的标题,而不是标签本身。

这是一些ascii艺术:

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

所以这是真正的“标签2”,目前可见,但我希望进度条(或同等)在第三个标签的标题中可见。

编辑2

这必须在Java 1.5上工作:这必须在无数的MacOS 10.4和MacOS 10.5苹果电脑上运行,这些电脑将永远不会配备Java 6(有些是做的,有些是不行的,而且从来不会这样做,这不是我的呼叫)

将JProgressbar放在一个JPanel中,并将该JPanel添加到JTabbedPane中。

编辑:从JTabbedPane JavaDoc :

//在这种情况下,自定义组件负责呈现标签的标题。

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

所以你可以基本上简单地通过对你的JProgressbar的引用replacenew JLabel("Tab") (尽pipe这个JProgressbar不能被添加到Tab本身)。 不过,我认为这个方法在Java 1.6之前并不存在。

对于较早的版本,您可以尝试addTab()并使用适当的Icon实现来指示进度。

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 actionPerformed(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; } } }