2012-01-16 18 views
9

Tôi tự hỏi liệu có ai trong số các bạn biết cách hiển thị thanh tiến trình trông đẹp mắt trong Java hay không, chủ yếu bằng cách sử dụng Swing, mặc dù tôi không ngại sử dụng thư viện của bên thứ ba.Thanh tiến trình tìm kiếm đẹp trong java

Tôi đã xem hướng dẫn JProgressBar nhưng không có hướng dẫn nào trong số đó đề cập đến tạo kiểu cho thanh. Đọc API tôi tìm thấy một phương thức getUI trả về đối tượng ProgressBarUI nhưng tôi không thấy nhiều cách để tùy chỉnh nó.

Điều tôi muốn là thêm các góc được làm tròn, thay đổi nền và màu nền trước, chiều rộng, chiều dài, bình thường.

Cảm ơn!

Trả lời

21

Nếu bạn không muốn thay thế giao diện Người dùng đã chọn của mình, hãy chọn & Cảm thấy, bạn chỉ có thể thay thế đại biểu giao diện người dùng bằng một đại diện từ BasicProgressBarUI.

enter image description here

import java.awt.Color; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Rectangle; 
import java.awt.RenderingHints; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JProgressBar; 
import javax.swing.plaf.basic.BasicProgressBarUI; 

/** @see http://stackoverflow.com/questions/8884297 */ 
public class ProgressBarUITest extends JPanel { 

    public ProgressBarUITest() { 
     JProgressBar jpb = new JProgressBar(); 
     jpb.setUI(new MyProgressUI()); 
     jpb.setForeground(Color.blue); 
     jpb.setIndeterminate(true); 
     this.add(jpb); 
    } 

    private static class MyProgressUI extends BasicProgressBarUI { 

     private Rectangle r = new Rectangle(); 

     @Override 
     protected void paintIndeterminate(Graphics g, JComponent c) { 
      Graphics2D g2d = (Graphics2D) g; 
      g2d.setRenderingHint(
       RenderingHints.KEY_ANTIALIASING, 
       RenderingHints.VALUE_ANTIALIAS_ON); 
      r = getBox(r); 
      g.setColor(progressBar.getForeground()); 
      g.fillOval(r.x, r.y, r.width, r.height); 
     } 
    } 

    private void display() { 
     JFrame f = new JFrame("ProgressBarUITest"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(this); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new ProgressBarUITest().display(); 
      } 
     }); 
    } 
} 
+0

Cảm ơn bạn đã trả lời rất chi tiết! 1 và câu trả lời đúng: D. Trong mọi trường hợp, cuối cùng tôi đã làm nó bằng cách sử dụng JPanel với biên giới tròn, chồng lên nhau trên đầu trang của người khác, kể từ khi "thanh tiến trình" của tôi là tĩnh, các trick hiện nó. Cảm ơn anyway cho tip tốt đẹp, trashgod, sẽ viết nó xuống để tham khảo thêm – AlejandroVK

+1

@Trashgod +1 cho đoạn mã tôi tìm thấy điều này trong khi tìm cách làm thế nào để tùy chỉnh 'JProgressBar' trên Google :). 1 điều với đoạn trích: trong 'paintIndeterminate (..)' bạn đưa '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' do đó thiếu 'g2d.fillOval (. .) 'cuộc gọi sẽ tạo ra đường biên chữ nhật 'JProgressBar'. –

+0

@DavidKroukamp: Tốt bắt; mặc dù "các phương thức kế thừa thực hiện giống hệt nhau ... trong cài đặt thuộc tính mặc định," 'g2d.fill (shape)' linh hoạt hơn nhiều. – trashgod

6

Cách đơn giản nhất để làm điều đó sẽ được change the LookAndFeel hoặc thậm chí có thể tạo lớp của riêng bạn mà mở rộng ra của một trong những mặc định L & Fs và chỉ thay đổi giao diện người dùng cho các thanh tiến trình ...

+0

Bất kỳ ý tưởng về cách để làm điều này đặc biệt dành cho một JProgressBar? – AlejandroVK

+0

@AlejandroVK khó nói cho bạn biết phải thử http://stackoverflow.com/questions/3954616/look-and-feel-in-java, tôi muốn sử dụng Chất gây nghiện, nhưng quá nhạy cảm với EDT, – mKorbel

+0

tất cả những thứ đó có vẻ quá mức cần thiết chỉ cho nhu cầu của tôi ... cảm ơn anyway – AlejandroVK