[英]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.