2010-08-14 9 views
10

Jeśli naprawdę chciałbym zrobić coś takiego, czy mogę umieścić JPOGressBar (lub jego odpowiednik) w zakładce JTabbedPane? (To znaczy, nie w samej karcieJava: JProgressBar (lub odpowiednik) w tytule zakładki JTabbedPane

Jak chciałbym zrobić coś takiego?

EDIT ja naprawdę chcę umieścić progressbar w tytule zakładki, a nie sam tab.

Oto niektóre ascii art:

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

Więc to naprawdę „tab 2”, który jest obecnie widoczny, ale chcę pasek postępu (lub jego odpowiednik) mają być widoczne w trzecim tabulatora tytule.

EDIT 2

To musi pracować na Java 1.5: to musi działać na niezliczoną MacOS 10.4 i 10.5 komputerów Apple MacOS, które nigdy nie będą wyposażone w Java 6 (niektórzy, niektórzy nie : i całkiem dużo nigdy nie będzie, to nie jest mój telefon)

Odpowiedz

4

Ułóż JProgressbar w JPanelu i dodaj JPanel do JTabbedPane.

Edit: Z JTabbedPane JavaDoc:

// W tym przypadku niestandardowych składnik jest odpowiedzialna za renderowanie tytuł zakładki.

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

Można więc w zasadzie po prostu zastąpić new JLabel("Tab") odniesieniem do swojej JProgressbar (choć JProgressbar nie musi być dodany do samego Tab). Jednak myślę, że ta metoda nie istnieje przed Java 1.6.

+0

edytowany moje pytanie, przepraszam za pierwszym brzmieniem. Czy twoja odpowiedź zadziała, jeśli chcę mieć zakładkę postępu w tytule zakładki? – NoozNooz42

+0

Gotowe. Spróbuj wyszukać google lub JavaDoc następnym razem;) – Tedil

+0

JavaDoc nie dała mi wiele i nie bez powodu: Java 1.6 jest dużym nie-nie. To musi działać na MacOS X 10.4 i na MacOS X 10.5, które kilka komputerów Apple wyposażonych w te ** nigdy ** nie będzie miało Javy 1.6 :) – NoozNooz42

15

Dla wcześniejszych wersji można wypróbować addTab() z odpowiednią implementacją Icon używaną do wskazania postępu.

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

, które naprawdę k * i * l * l * e * d mnie, doskonałe + 1 – mKorbel

+0

Zobacz także [odpowiedź] (http://stackoverflow.com/a/10055672/230513). – trashgod

+0

+1 niesamowity jak zawsze –

Powiązane problemy