2010-08-14 16 views
10

Si realmente quisiera hacer algo así, ¿puedo poner un JProgressBar (o su equivalente) en una pestaña JTabbedPane? (Es decir, no en la misma pestaña,Java: JProgressBar (o equivalente) en un título de la pestaña JTabbedPane

¿Cómo iba a hacer algo así?

EDITAR verdad quiero poner el progressbar en el título de la pestaña, no la pestaña sí.

Aquí hay un poco de arte ASCII:

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

lo que es realmente "tab 2" que es actualmente visible, pero quiero la barra de progreso (o equivalente) sean visibles en el título de la tercera pestaña.

EDIT 2

Esto tiene que trabajar en Java 1.5: esto tiene que trabajar en la innumerable MacOS 10.4 y 10.5 de MacOS ordenadores de Apple que nunca serán equipados con Java 6 (algunos lo hacen, algunos no lo hacen : y bastante nunca lo hará, no es mi llamado)

Respuesta

4

Incluya la JProgressbar en un JPanel y agregue ese JPanel al JTabbedPane.

Editar: Desde el JTabbedPane JavaDoc:

// En este caso, el componente personalizado es el encargado de mostrar el título de la ficha.

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

por lo que podría básicamente sólo tiene que sustituir new JLabel("Tab") por una referencia a su JProgressBar (aunque esto JProgressBar no debe ser añadido a la propia Tab). Sin embargo, creo que este método no existe antes de Java 1.6.

+0

he editado mi pregunta, lo siento por la primera redacción. ¿Funcionaría tu respuesta si quiero una pestaña de progreso en el título de la pestaña? – NoozNooz42

+0

Hecho. Intente buscar google o JavaDoc la próxima vez;) – Tedil

+0

JavaDoc no me dio mucho y por una razón: Java 1.6 es un gran no-no. Esto tiene que funcionar en MacOS X 10.4 y en MacOS X 10.5, que varios equipos Apple equipados con estos ** nunca ** tendrán Java 1.6 :) – NoozNooz42

15

Para versiones anteriores, puede probar addTab() con una implementación adecuada de Icon utilizada para indicar el progreso.

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 realmente k * i * l * l * e * d me, excelente + 1 – mKorbel

+0

Ver también este [respuesta] (http://stackoverflow.com/a/10055672/230513). – trashgod

+0

+1 increíble como siempre –

Cuestiones relacionadas