2016-04-13 16 views
1

ねえ、私はこのクラスを見つけましたが、どのように使用するのか分かりません。私はJAVAの初心者ですので、ここでコードは簡単です。私はいくつかの方法を試みたが、何も働かなかった。エッジが滑らかであるようです。Javaスイングで循環進捗コンポーネントを作成する方法

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

例[here](http://stackoverflow.com/a/16182793/230513)および[here](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 defaultとして登録する必要があります。

myProgressBar.setUI(new ProgressCircleUI()); 

又は

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

注:場合によってスイングの最初の方法によって設定されるUIをリセットすることができます。最初の方法がうまくいかない場合は、2番目の方法を試してください。

更新:第3の方法があります:JProgressBarのサブクラスを作成し、通常のものの代わりに使用することができます。

+0

私は最初のコードを試しました。私のjprogressバーは消えました。 2番目のコードを試しました。どんな提案も何も起こらなかった? –

+0

[SSCCE](http://sscce.org)を入力してください。何が間違っているのか理解できます。 –

+0

L&F –

関連する問題