代码之家  ›  专栏  ›  技术社区  ›  NoozNooz42

Java:JTabbedPane选项卡标题中的JProgressBar(或等效项)

  •  10
  • NoozNooz42  · 技术社区  · 14 年前

    如果我真的想做这样的事情,我能在JTabbedPane选项卡中放一个JProgressBar(或者它的等价物)吗?(我是说,不是在标签上,

    我该怎么做那样的事?

    编辑

    以下是一些ascii艺术:

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

    所以它实际上是“tab2”当前可见,但我希望进度条(或等效项)在第三个tab中可见 标题 .

    编辑2

    这必须在Java1.5上起作用:这必须在无数的MacOS10.4和MacOS10.5苹果电脑上起作用,这些电脑永远不会配备Java6(有些会,有些不会:而且很多永远不会,这不是我的职责)

    2 回复  |  直到 14 年前
        1
  •  5
  •   Tedil    14 年前

    JTabbedPane JavaDoc :

    //在本例中,自定义组件 负责呈现

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

    所以你基本上可以 new JLabel("Tab") 通过对JProgressbar的引用(尽管不能将此JProgressbar添加到选项卡本身)。

        2
  •  15
  •   trashgod    13 年前

    对于早期版本,您可以尝试 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;
            }
        }
    }