2016-04-13 5 views
1

эй ребята, я нашел этот класс, но я понятия не имею, как его использовать. Я новичок в JAVA, так что легко на меня, вот код. Я пробовал несколько способов, но ничего не работало. кажется, что края гладкие.Как создать круговой компонент прогресса в java swing

import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Insets; 
import java.awt.RenderingHints; 
import java.awt.Shape; 
import java.awt.geom.Arc2D; 
import java.awt.geom.Area; 
import java.awt.geom.Ellipse2D; 
import javax.swing.JComponent; 
import javax.swing.plaf.basic.BasicProgressBarUI; 

class ProgressCircleUI extends BasicProgressBarUI { 
    @Override public Dimension getPreferredSize(JComponent c) { 
    Dimension d = super.getPreferredSize(c); 
    int v = Math.max(d.width, d.height); 
    d.setSize(v, v); 
    return d; 
    } 
    @Override 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); 
    double cx = b.left + barRectWidth * .5; 
    double cy = b.top + barRectHeight * .5; 
    double or = sz * .5; 
    double ir = or * .5; //or - 20; 
    Shape inner = new Ellipse2D.Double(cx - ir, cy - ir, ir * 2, ir * 2); 
    Shape outer = new Arc2D.Double(
     cx - or, cy - or, sz, sz, 90 - degree, degree, Arc2D.PIE); 
    Area area = new Area(outer); 
    area.subtract(new Area(inner)); 
    g2.fill(area); 
    g2.dispose(); 

    // Deal with possible text painting 
    if (progressBar.isStringPainted()) { 
     paintString(g, b.left, b.top, barRectWidth, barRectHeight, 0, b); 
    } 
    } 
} 

вещь, я не знаю, как заставить ее работать. любая помощь?

+1

Предлагаю вам ознакомиться с документами для BasicProgressBarUI, поскольку этот класс расширяет его. – jr593

+1

Примеры [здесь] (http://stackoverflow.com/a/16182793/230513) и [здесь] (http://stackoverflow.com/a/16333445/230513). – trashgod

+0

это могло бы помочь :-) https://github.com/aterai/java-swing-tips/blob/master/ProgressCircle/src/java/example/MainPanel.java – aterai

ответ

2

Вам необходимо установить его для компонента или зарегистрировать его по всему миру как L & F по умолчанию.

myProgressBar.setUI(new ProgressCircleUI()); 

или

UIManager.put("ProgressBarUI", ProgressCircleUI.class.getName()); 

Примечание: в некоторых случаях свинг может сбросить пользовательский интерфейс, который установлен с помощью первого способа. Поэтому, если первый способ не работает, попробуйте второй.

Обновление: существует третий способ: вы можете создать подкласс JProgressBar и использовать его вместо обычных.

public class JCircleProgressBar extends JProgressBar { 

    public void setUI(ComponentUI newUI) { 
     super.setUI(new ProgressCircleUI()); 
    } 
} 
+0

Я пробовал первый код. мой jprogress bar исчез. попробовал второй код. ничего не было предложений? –

+0

Пожалуйста, предоставьте [SSCCE] (http://sscce.org), чтобы я мог понять, что случилось. –

+0

Первый и второй способ должен применяться после того, как вы установили L & F –

Смежные вопросы