Menampilkan Undetermined Circle Progressbar di Java


Terkadang, dalam menjalankan perintah yang tidak dapat ditentukan nilai progress presentasenya, dibutuhkan untuk menampilkan progressbar yang berupa circle yang berputar secara terus menerus.

Hal ini seperti memanggil sebuah halaman website, dimana website tersebut tidak dapat dihitung berapa ukuran sebenarnya.

Sehingga tidak dapat membandingkan atau menghitung seberapa persen halaman yang sudah terdownload, dibanding yang belum.

Kode berikut adalah kode class ProgressCircleUI yang telah penulis modifikasi, untuk menampilkan progressbar circle yang berputar secara terus-menerus.

package circleloopprogressbar; 
 
import java.awt.BasicStroke; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Insets; 
import java.awt.RenderingHints; 
import javax.swing.JComponent; 
import javax.swing.plaf.basic.BasicProgressBarUI; 
 
/** 
 * 
 * @author Edugameapp 
 */ 
public class ProgressCircleUI extends BasicProgressBarUI 
{ 
    private int startAngle=0; 
    private int reverse=-1; 
    private int lineWidth=2; 

    public Dimension getPreferredSize(JComponent c) { 
        Dimension d = super.getPreferredSize(c); 
        int v = Math.max(d.width, d.height); 
        d.setSize(v, v); 
        return d; 
    } 
 
    public void paint(Graphics g, JComponent c) { 
        Insets b = progressBar.getInsets(); // area for border 
        int barRectWidth = progressBar.getWidth() - b.right - b.left; 
        int barRectHeight = progressBar.getHeight() - b.top - b.bottom; 
        if (barRectWidth <= 0 || barRectHeight <= 0) { 
            return; 
        } 
 
        // draw the cells 
        Graphics2D g2 = (Graphics2D) g.create(); 
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
        g2.setPaint(progressBar.getForeground()); 
        double degree = 360 * progressBar.getPercentComplete(); 
        double sz = Math.min(barRectWidth, barRectHeight); 
        g2.setStroke(new BasicStroke(2*lineWidth)); 
        g2.drawArc(lineWidth,lineWidth,(int)(sz-2*lineWidth),(int)(sz-2*lineWidth),startAngle,(int)(reverse*degree)); 
        g2.dispose(); 
 
        // Deal with possible text painting 
        if (progressBar.isStringPainted()) { 
            paintString(g, b.left, b.top, barRectWidth, barRectHeight, 0, b); 
        } 
    } 
 
    public int getStartAngle() { 
        return startAngle; 
    } 
 
    public void setStartAngle(int startAngle) { 
        this.startAngle = startAngle; 
    } 
 
    public int getReverse() { 
        return reverse; 
    } 
 
    public void setReverse(int reverse) { 
        this.reverse = reverse; 
    } 
 
    public void setLineWidth(int lineWidth) { 
        this.lineWidth = lineWidth; 
    } 
} 

Sedangkan kode di bawah ini adalah contoh kode main Java, untuk menggunakan class ProgressCircleUI di atas.

package circleloopprogressbar; 
 
import java.awt.Dimension; 
import java.awt.GridLayout; 
import java.awt.Toolkit; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.BorderFactory; 
import javax.swing.JFrame; 
import javax.swing.JProgressBar; 
import javax.swing.Timer; 
import javax.swing.WindowConstants; 
 
/** 
 * 
 * @author Edugameapp 
 */ 
public class CircleLoopProgressbar extends JFrame 
{ 
    private JProgressBar progressbar = new JProgressBar(); 
    private Timer timer; 
    private int modeProgressbar=1; 

    public void setup() 
    { 
        setTitle("Circle Loop Progressbar"); 

        setLayout(new GridLayout()); 

        timer = new Timer(10, new ActionListener() { 
            @Override 
            public void actionPerformed(ActionEvent e) { 
                int iv = progressbar.getValue(); 
                if(modeProgressbar>0){ 
                    iv++; 
                }else{ 
                    iv--; 
                } 
                iv = Math.max(0,Math.min(100,iv)); 
                progressbar.setValue(iv); 
                if (progressbar.getValue() == 100) { 
                    modeProgressbar*=-1; 
                    ((ProgressCircleUI)progressbar.getUI()).setReverse(-modeProgressbar); 
                }else if (progressbar.getValue() == 0) { 
                    modeProgressbar*=-1; 
                    ((ProgressCircleUI)progressbar.getUI()).setReverse(-modeProgressbar); 
                } 
            } 
        }); 
        progressbar = new JProgressBar(); 
        progressbar.setUI(new ProgressCircleUI()); 
        ((ProgressCircleUI)progressbar.getUI()).setStartAngle(90); 
        ((ProgressCircleUI)progressbar.getUI()).setLineWidth(20); 
        progressbar.setBorder(BorderFactory.createEmptyBorder(0,0,0,0)); 
        progressbar.setPreferredSize(new Dimension(250,250)); 
        timer.start(); 

        add(progressbar); 
        pack(); 

        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 
        setLocation((int)(0.5*(screenSize.getWidth()-getWidth())),(int)(0.5*(screenSize.getHeight()-getHeight()))); 
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
        getContentPane().requestFocusInWindow(); 
        setVisible(true); 
    } 

    public static void main(String[] args) { 
        CircleLoopProgressbar main=new CircleLoopProgressbar(); 
        main.setup(); 
    } 

} 

Timer digunakan untuk menjalankan animasi, yang dalam implementasi yang sesungguhnya akan diperlukan memanggil timer.stop() saat progress telah benar-benar selesai.

Referensi

Komentar



Postingan populer dari blog ini

Apps Script untuk Cetak Sertifikat

Kumpulan Source Code Greenfoot

Menyembunyikan Failed Load Images di Blogger

Kode Greenfoot Game Flappy Bird

Algorithma Coretan Abstrak dengan HTML5 Canvas

Kebodohan Karyawan Menyalahkan Sistem

Algorithma Bilangan Prima dengan Javascript

Checking Data yang Belum Dimasukkan dalam Daftar Menggunakan Query Google Sheet

Mencoba Submit Theme di Wordpress.org

Generate Karakter Acak dan Menempatkannya di Sel Google Sheets dengan Apps Script