2013-05-02 3 views
2

Я хочу показать прогресс в формате пирога. Может ли кто-нибудь помочь? У меня есть данные для показа, но как показать это в этом формате. Что-то вроде прогресса, показанного в Google Chrome при загрузке файлов.Java Swing показывает прогресс в форме пирога

image

+1

См. Также [Q & A] (http://stackoverflow.com/q/16182705/230513). – trashgod

+0

Нет, я не хочу менять цвет. Я хочу изменить форму от прямоугольника до круга – Complicated

ответ

3

Основываясь на ссылки, представленные @trashgod, вот один из способов вы можете достичь эффекта «Pie». Это только обрабатывает неопределенный индикатор выполнения, но было бы очень легко добавить «детерминированное» поведение.

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
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() { 
     super(new BorderLayout()); 
     JProgressBar jpb = new JProgressBar(); 
     jpb.setUI(new MyProgressUI()); 
     jpb.setForeground(Color.GRAY); 
     jpb.setIndeterminate(true); 
     this.add(jpb); 
    } 

    private static class MyProgressUI extends BasicProgressBarUI { 

     private static final int ARC_EXTENT = 25; 

     @Override 
     protected void installDefaults() { 
      super.installDefaults(); 
      progressBar.setBorder(null); 
     } 

     @Override 
     protected void paintIndeterminate(Graphics g, JComponent c) { 
      int angle = (int) (90 - 360.0 * getAnimationIndex()/getFrameCount()); 
      Graphics2D g2d = (Graphics2D) g; 
      g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
      g.setColor(progressBar.getForeground()); 
      int size = Math.min(c.getWidth(), c.getHeight()); 
      g2d.fillArc((c.getWidth() - size)/2, (c.getHeight() - size)/2, size, size, angle - ARC_EXTENT, ARC_EXTENT); 
     } 

     @Override 
     protected Rectangle getBox(Rectangle r) { 
      if (r != null) { 
       r.setBounds(progressBar.getBounds()); 
       return r; 
      } 
      return progressBar.getBounds(); 
     } 

     @Override 
     public Dimension getPreferredSize(JComponent c) { 
      return new Dimension(100, 100); 
     } 
    } 

    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

, когда мы устанавливаем значение и делаем intermidiate false, это перестает работать :( – Complicated

+0

@Skyscraper Это именно то, что говорит мое первое предложение. время, чтобы полностью прочитать ответы раньше. Из приведенного выше кода тривиально сделать детерминированный! –

+0

Сделано спасибо за помощь – Complicated