2012-01-16 32 views
9

Me pregunto si alguno de ustedes sabe cómo mostrar una agradable barra de progreso en Java, principalmente usando Swing, aunque no me importa usar bibliotecas de terceros.Bonita barra de progreso en java

He estado viendo los tutoriales de JProgressBar, pero ninguno de ellos se refiere al estilo de la barra. Leyendo la API Encontré un método getUI que devuelve el objeto ProgressBarUI pero no veo muchas maneras de personalizarlo.

Lo que quiero es agregar esquinas redondeadas, cambiar el fondo y el color de primer plano, ancho, longitud, el habitual.

Gracias!

Respuesta

21

Si no desea reemplazar el Look & elegido por el usuario Siente, puedes simplemente reemplazar el delegado UI con uno derivado de 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

Gracias por una respuesta muy detallada! +1 y respuesta correcta: D. En cualquier caso, al final lo hice usando JPanel con bordes redondeados, superponiendo uno sobre otro, ya que mis "barras de progreso" son estáticas, el truco lo hace. Gracias de todos modos por el buen consejo, trashgod, lo escribirá para referencia futura – AlejandroVK

+1

@Trashgod +1 para el fragmento lo encontré mientras buscaba cómo personalizar 'JProgressBar' en Google :). 1 cosa con el fragmento: en 'paintIndeterminate (..)' arrojas 'Graphic's object' g' a 'Graphics2D' pero pintas a través de' g.fillOval (..) 'faltando así' g2d.fillOval (. .) llamada que crearía el borde rectangular 'JProgressBar'. –

+0

@DavidKroukamp: Buena captura; aunque los "métodos heredados funcionan de forma idéntica ... en la configuración de atributos predeterminada", 'g2d.fill (forma)' es mucho más versátil. – trashgod

6

La manera más fácil de hacer eso sería change the LookAndFeel o incluso crear su propia clase que se extiende fuera de una de las predeterminado L & Fs y sólo cambia la interfaz de usuario de la barra de progreso ...

+0

Cualquier ideas sobre cómo hacer esto específicamente para un JProgressBar? – AlejandroVK

+0

@AlejandroVK es difícil de decir que tengas que probar http://stackoverflow.com/questions/3954616/look-and-feel-in-java, preferiría Sustancia, pero es demasiado EDT sensible, – mKorbel

+0

todos esos parecen excesivos para mis necesidades ... gracias de todos modos – AlejandroVK