2010-08-14 33 views
10

Nếu tôi thực sự muốn làm điều gì đó như vậy, tôi có thể đặt JProgressBar (hoặc tương đương) trong tab JTabbedPane không? (Tôi có nghĩa là, không phải trong tab chính nó,Java: JProgressBar (hoặc tương đương) trong tiêu đề tab JTabbedPane

Làm thế nào tôi sẽ làm một cái gì đó như thế?

EDIT tôi thực sự muốn đặt progressbar trong tiêu đề của tab, không phải là tab riêng của mình.

Dưới đây là một số nghệ thuật ascii:

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

Vì vậy, nó thực sự "tab 2" có nghĩa là hiện nay có thể nhìn thấy, nhưng tôi muốn thanh tiến trình (hoặc tương đương) để được hiển thị trong tab thứ ba danh.

EDIT 2

này có để làm việc trên Java 1.5: điều này đã làm việc trên không biết bao nhiêu hệ điều hành MacOS 10,4 và hệ điều hành MacOS 10,5 máy tính Apple sẽ không bao giờ được trang bị với Java 6 (một số làm, một số thì không : và khá nhiều sẽ không bao giờ, nó không phải là cuộc gọi của tôi)

Trả lời

4

Đính kèm JProgressbar trong JPanel và thêm JPanel đó vào JTabbedPane.

Edit: Từ JTabbedPane JavaDoc:

// Trong trường hợp này các thành phần tùy chỉnh có trách nhiệm render tiêu đề của tab.

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

Vì vậy, bạn có thể về cơ bản chỉ cần thay thế new JLabel("Tab") bởi một tham chiếu đến JProgressbar của bạn (mặc dù JProgressbar này phải không được bổ sung vào Tab chính nó). Tuy nhiên, tôi nghĩ phương pháp này không tồn tại trước Java 1.6.

+0

tôi thay đổi nội dung câu hỏi của tôi, xin lỗi vì từ ngữ đầu tiên. Câu trả lời của bạn có hoạt động nếu tôi muốn một tab tiến trình trong tiêu đề của tab không? – NoozNooz42

+0

Xong. Hãy thử tìm kiếm google hoặc JavaDoc lần sau;) – Tedil

+0

JavaDoc đã không cho tôi nhiều và vì một lý do: Java 1.6 là một không lớn. Điều này phải làm việc trên MacOS X 10.4 và trên MacOS X 10.5, mà một số máy tính Apple được trang bị với những điều này sẽ ** không bao giờ ** có Java 1.6 :) – NoozNooz42

15

Đối với các phiên bản cũ hơn, bạn có thể thử addTab() khi triển khai phù hợp Icon được sử dụng để biểu thị tiến độ.

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

thực sự k * i * l * l * e * d tôi, xuất sắc + 1 – mKorbel

+0

Xem thêm [answer] này (http://stackoverflow.com/a/10055672/230513). – trashgod

+0

+1 tuyệt vời như mọi khi –

Các vấn đề liên quan