2012-01-16 31 views
9

Üçüncü parti kütüphaneleri kullanmama rağmen, Java'da hoş görünen bir ilerleme çubuğu göstermeyi biliyorsunuzdur.Java'da güzel görünümlü ilerleme çubuğu

JProgressBar öğreticilerine bakıyordum ancak bunların hiçbiri çubuğun stilini belirtmiyor. API'yi Okuma ProgressBarUI nesnesini döndüren bir getUI yöntemi buldum, ancak bunu özelleştirmek için pek çok yol göremiyorum.

İstediğim şey, köşeleri yuvarlatmak, arka planı ve önplan rengini, genişliğini, uzunluğunu, normalini değiştirmek.

Teşekkürler!

cevap

21

yaratacak Kullanıcının seçtiği Look & Feel'i değiştirmek istemiyorsanız, UI temsilcisini yalnızca BasicProgressBarUI'dan türetilmiş olan biriyle değiştirebilirsiniz.

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

Çok detaylı bir cevap için teşekkürler! +1 ve doğru cevap: D. Her halükarda, sonunda, "ilerleme çubuklarım" statik olduğundan, hile yapamadığından, JPanel'i yuvarlak kenarlı kullanarak, diğerinin üzerine bindirerek yaptım. Hoş ipucu için zaten teşekkürler, trashgod, daha fazla referans için aşağı yazacak – AlejandroVK

+1

@ Snippet için Trashgod +1 Bunu Google'da 'JProgressBar' nasıl özelleştirileceğini ararken buldum :). Snippet ile 1 şey: 'paintIndeterminate (..)' '' '' '' '' '' '' '' '' '' '' '' '' g2d.fillOval (') g /. .) 'jProgressBar 'dikdörtgen sınırını yaratacak çağrı. –

+0

@DavidKroukamp: İyi yakalama; "eski yöntemler, varsayılan öznitelik ayarları altında ... aynı şekilde performans gösterse de", "g2d.fill (şekil)" çok daha çok yönlüdür. – trashgod

6

Bunu yapmanın en kolay yolu change the LookAndFeel Olmak ya da sen ise belki de varsayılan L & Fs birinin hemen uzanır ve sadece ilerleme çubuğunun UI değişiklikleri kendi sınıfını ...

+0

bir JProgressBar için özel olarak bunun nasıl herhangi bir fikir? – AlejandroVK

+0

@AlejandroVK, http://stackoverflow.com/questions/3954616/look-and-feel-in-java'yı denemek zorunda olduğunuzu söylemek zor, Madde tercih ediyorum ama çok fazla EDT duyarlı, – mKorbel

+0

tüm bunlar overkill görünüyor sadece ihtiyaçlarım için ... teşekkürler zaten – AlejandroVK

İlgili konular