Magazine Informatica

Personalizzare la JProgressBar in Java

Creato il 25 giugno 2012 da Ketek @CarloVentrella

La JProgressBar è uno strumento molto utile in quanto ci permette di monitorare l'avanzamento del processo che "monitora". La classe JProgressBar non consente la personalizzazione dei colori quindi dovremo ricorrere all'UI Manager, la classe che gestisce il look&feel degli oggetti swing.

JProgressBar personalizzata

Vediamo come modificare alcune proprietà della JProgressBar:

 
UIManager.put("ProgressBar.background", Color.BLUE);
UIManager.put("ProgressBar.foreground", Color.WHITE);
UIManager.put("ProgressBar.selectionBackground",Color.GREEN);
UIManager.put("ProgressBar.selectionForeground",Color.BLUE);
 

In questo modo è possibile modificare i colori, con un pò di fantasia possiamo realizzare una JProgressBar più originale: il codice seguente è quello utilizzato per ottenere la JProgressBar dell'immagine di sopra.

Ecco il codice:

 
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
 
import javax.swing.*;
import javax.swing.plaf.basic.BasicProgressBarUI;
 
public class progressBar
{
                public progressBar()
                {
                               JFrame f = new JFrame("Progress Bar - demo");
                               JPanelWithBackgr  progress_background = new JPanelWithBackgr ("C:\progress_background.png");
 
                                UIManager.put("ProgressBar.background", new Color(29,29,29));
                                UIManager.put("ProgressBar.foreground", new Color(16,95,173));
                                UIManager.put("ProgressBar.selectionBackground",new Color(214,214,214));
                                UIManager.put("ProgressBar.selectionForeground",new Color(29,29,29));
 
                               final JProgressBar jp = new JProgressBar();
 
                               jp.setUI(new BasicProgressBarUI());
 
                               jp.setBounds(11, 12 ,434, 25);
                               jp.setMinimum(0);
                               jp.setMaximum(100);
                               jp.setStringPainted(true);
                               jp.setBorder(null);
                               progress_background.add(jp);
                               f.add(progress_background);
                               f.setResizable(false);
                               f.pack();
                               f.setVisible(true);
 
                               Thread runner = new Thread() {
 
                                               int counter;
                                               int minValue = 0;
                                               int maxValue = 100;
 
                          public void run() {
                            counter = minValue;
 
                            while (counter <= maxValue) {
                              Runnable runme = new Runnable() {
                                public void run() {
                                  jp.setValue(counter);
                                  System.out.println(counter);
                                }
                              };
                              SwingUtilities.invokeLater(runme);
                              counter++;
                              try {
                                Thread.sleep(100);
                              } catch (Exception ex) {
                              }
                            }
                          }
                        };
 
                        runner.start();
 
                        WindowListener wndCloser = new WindowAdapter() {
                            public void windowClosing(WindowEvent e) {
                              System.exit(0);
                            }
                          };
 
                        f.addWindowListener(wndCloser);
 
                }
 
                public static void main(String Args[])
                {
                               new progressBar();
                }
}
 

Con questo codice ho applicato uno sfondo (Applicare uno sfondo ad un JPanel - Java) realizzato in Photoshop che corrisponde alla "cornice" della barra e posto su questo la JProgressBar a cui ho assegnato, il colore grigio dell'immagine di sfondo in modo da farla sembrare parte integrante dello sfondo e un colore blu/azzurro come colore per l'avanzamento.

Download: Ketek - JprogressBar



Ritornare alla prima pagina di Logo Paperblog