簡體   English   中英

如何在 java 中舍入進度條?

[英]How do I round a progress bar in java?

最近我很難在 java swing 中做任何事情。 盡管我能夠將內部變圓,但我無法將進度條的外部變圓。

這是目前的結果。 但我希望白色部分具有相同的圓度。 當前結果

當前結果

這是我的代碼

package Visual.Componentes;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.RoundRectangle2D;

import javax.swing.JComponent;
import javax.swing.JProgressBar;
import javax.swing.plaf.basic.BasicProgressBarUI;

public class BarraProgresoPersonalizada extends JProgressBar {

    public Color getColorString() {
        return colorString;
    }

    public void setColorString(Color colorString) {
        this.colorString = colorString;
    }

    private Color colorString = new Color(200, 200, 200);

    public BarraProgresoPersonalizada() {
        
        setForeground(new Color(79, 199, 134));
        setUI(new FancyProgressBar());   
        
    }

    class FancyProgressBar extends BasicProgressBarUI {

        @Override
        protected Dimension getPreferredInnerVertical() {
            return new Dimension(20, 146);
        }

        @Override
        protected Dimension getPreferredInnerHorizontal() {
            return new Dimension(146, 20);
        }



        @Override
        protected void paintDeterminate(Graphics g, JComponent c) {

            Graphics2D g2d = (Graphics2D) g.create();

            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

            int iStrokWidth = 3;
            g2d.setStroke(new BasicStroke(iStrokWidth, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
            g2d.setColor(progressBar.getBackground());
            g2d.setBackground(progressBar.getBackground());

            int width = progressBar.getWidth();
            int height = progressBar.getHeight();

            RoundRectangle2D outline = new RoundRectangle2D.Double((iStrokWidth / 2), (iStrokWidth / 2),
                    width - iStrokWidth, height - iStrokWidth,
                    height, height);

            g2d.draw(outline);

            int iInnerHeight = height - (iStrokWidth * 2);
            int iInnerWidth = width - (iStrokWidth * 2);

            double dProgress = progressBar.getPercentComplete();
            if (dProgress < 0) {
                dProgress = 0;
            } else if (dProgress > 1) {
                dProgress = 1;
            }

            iInnerWidth = (int) Math.round(iInnerWidth * dProgress);

            g2d.setPaint(getForeground());

            RoundRectangle2D fill = new RoundRectangle2D.Double(iStrokWidth, iStrokWidth,
                    iInnerWidth, iInnerHeight, 20, 20);

            g2d.fill(fill);

            g2d.dispose();
        }

        @Override
        protected void paintIndeterminate(Graphics g, JComponent c) {
            super.paintIndeterminate(g, c); //To change body of generated methods, choose Tools | Templates.
        }

    }
}

如您所見,這是我在另一個出版物中找到的一個示例,我對其進行了一些修改,首先是包含內部欄 UI 的 class,然后是另一個 class,它已經將 UI 添加到組件以保存我那一步以后。 我試着用 PaintBorder 把外面弄圓,但沒有用,我也用 BorderFactory 試過,但也沒有用。 如果有人能幫我一把,我將不勝感激。 EYE,這是一個個人項目。

我找到了解決方案,我只需要創建一個繪制fillRoundRect的paint方法,問題是看到了原來的方形框。

@Override
    public void paint(Graphics g, JComponent c) {
        Graphics2D g2 = (Graphics2D) g.create();
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        if (c.isFocusOwner()) {
            g2.setColor(Color.red);
        } else {
            g2.setColor(Color.red);
        }
        g2.fillRoundRect(0, 0, getWidth(), getHeight(), 20, 20);
        g2.dispose();
        super.paint(g, c);
    }

這是它的樣子:

但是我可以通過在 BarraProgresoPersonalizada class 的構造函數中使進度條不透明來修復它。

setOpaque(false)

當前結果:

我希望這個對你有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM