2010-08-14 4 views
10

Si je voulais vraiment faire quelque chose comme ça, puis-je mettre un JProgressBar (ou son équivalent) dans un onglet JTabbedPane? (Je veux dire, pas dans l'onglet lui-même,Java: JProgressBar (ou équivalent) dans un onglet JTabbedPane title

Comment puis-je faire quelque chose comme ça?

EDIT Je ne veux vraiment mettre la barre de progression dans le titre de l'onglet, et non l'onglet lui-même.

Voici quelques ascii art:

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

il est vraiment « onglet 2 » qui est actuellement visible, mais je veux la barre de progression (ou équivalent) soient visibles dans le troisième onglet titre.

EDIT 2

Cela doit travailler sur Java 1.5: il doit travailler sur les innombrables ordinateurs MacOS 10.4 et MacOS 10.5 d'Apple qui ne sera jamais équipé de Java 6 (certains font, d'autres pas : et beaucoup ne le sera jamais, ce n'est pas mon appel)

Répondre

4

Enclose la barre JProgress dans un JPanel et ajoutez ce JPanel au JTabbedPane.

Edit: De l'JTabbedPane JavaDoc:

// Dans ce cas, le composant personnalisé est chargé de rendre le titre de l'onglet.

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

Ainsi, vous pouvez remplacer essentiellement simplement new JLabel("Tab") par une référence à votre JProgressbar (bien que ce JProgressbar ne doit pas être ajouté à l'onglet lui-même). Cependant, je pense que cette méthode n'existe pas avant Java 1.6.

+0

J'ai effectué ma question, désolé pour la première formulation. Votre réponse fonctionnerait-elle si je voulais un onglet de progression dans le titre de l'onglet? – NoozNooz42

+0

Terminé. Essayez de chercher google ou JavaDoc la prochaine fois;) – Tedil

+0

JavaDoc ne m'a pas donné beaucoup et pour une raison: Java 1.6 est un grand non-non. Cela doit fonctionner sur MacOS X 10.4 et sur MacOS X 10.5, dont plusieurs ordinateurs Apple équipés de ceux-ci n'auront ** jamais ** Java 1.6 :) – NoozNooz42

15

Pour les versions antérieures, vous pouvez essayer addTab() avec une implémentation appropriée de Icon utilisée pour indiquer la progression.

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; 
     } 
    } 
} 
+2

que vraiment k * i * l * l * e * d moi, excelent + 1 – mKorbel

+0

Voir aussi cette [réponse] (http://stackoverflow.com/a/10055672/230513). – trashgod

+0

+1 génial comme toujours –