步骤 1 : 环形进度条 步骤 2 : CircleProgressBar 步骤 3 : 使用CircleProgressBar
像这样,需要一个环形进度条。 因为Swing默认不提供,所以需要自己开发一个环形进度条的组件。
增值内容,请先登录
完整的J2SE桌面项目,从无到有完整的开发流程,涵盖全部52个知识点,154个开发步骤, 一共36个讲解视频,累计时长3小时10分59秒,大小1.94G,充实J2SE项目经验,为简历加上一个有吸引力的砝码
增值内容,点击购买
使用爬虫已经被系统记录,请勿使用爬虫,增大封号风险。 如果是误封 ,请联系站长,谢谢
package util;
import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.SwingWorker;
public class CircleProgressBar extends JPanel {
private int minimumProgress;
private int maximumProgress;
private int progress;
private String progressText;
private Color backgroundColor;
private Color foregroundColor;
public CircleProgressBar() {
minimumProgress = 0;
maximumProgress = 100;
progressText = "0%";
}
public void paint(Graphics g) {
super.paint(g);
Graphics2D graphics2d = (Graphics2D) g;
// 开启抗锯齿
graphics2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
int x = 0;
int y = 0;
int width = 0;
int height = 0;
int fontSize = 0;
if (getWidth() >= getHeight()) {
x = (getWidth() - getHeight()) / 2 + 25;
y = 25;
width = getHeight() - 50;
height = getHeight() - 50;
fontSize = getWidth() / 8;
} else {
x = 25;
y = (getHeight() - getWidth()) / 2 + 25;
width = getWidth() - 50;
height = getWidth() - 50;
fontSize = getHeight() / 8;
}
graphics2d.setStroke(new BasicStroke(20.0f));
graphics2d.setColor(backgroundColor);
graphics2d.drawArc(x, y, width, height, 0, 360);
graphics2d.setColor(foregroundColor);
graphics2d.drawArc(x, y, width, height, 90,
-(int) (360 * ((progress * 1.0) / (maximumProgress - minimumProgress))));
graphics2d.setFont(new Font("黑体", Font.BOLD, fontSize));
FontMetrics fontMetrics = graphics2d.getFontMetrics();
int digitalWidth = fontMetrics.stringWidth(progressText);
int digitalAscent = fontMetrics.getAscent();
graphics2d.setColor(foregroundColor);
graphics2d.drawString(progressText, getWidth() / 2 - digitalWidth / 2, getHeight() / 2 + digitalAscent / 2);
}
public int getProgress() {
return progress;
}
public void setProgress(int progress) {
if (progress >= minimumProgress && progress <= maximumProgress)
this.progress = progress;
if (progress > maximumProgress)
this.progress = maximumProgress;
this.progressText = String.valueOf(progress + "%");
this.repaint();
}
public Color getBackgroundColor() {
return backgroundColor;
}
public void setBackgroundColor(Color backgroundColor) {
this.backgroundColor = backgroundColor;
this.repaint();
}
public Color getForegroundColor() {
return foregroundColor;
}
public void setForegroundColor(Color foregroundColor) {
this.foregroundColor = foregroundColor;
this.repaint();
}
}
增值内容,请先登录
完整的J2SE桌面项目,从无到有完整的开发流程,涵盖全部52个知识点,154个开发步骤, 一共36个讲解视频,累计时长3小时10分59秒,大小1.94G,充实J2SE项目经验,为简历加上一个有吸引力的砝码
增值内容,点击购买
使用爬虫已经被系统记录,请勿使用爬虫,增大封号风险。 如果是误封 ,请联系站长,谢谢
package test;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.SwingWorker;
import util.CircleProgressBar;
import util.ColorUtil;
import util.GUIUtil;
public class Test {
public static void main(String[] args) {
GUIUtil.useLNF();
//面板
JPanel p = new JPanel();
//进度条组件
CircleProgressBar cpb = new CircleProgressBar();
cpb.setBackgroundColor(ColorUtil.blueColor);
cpb.setProgress(0);
//按钮
JButton b = new JButton("点击");
//添加组件
p.setLayout(new BorderLayout());
p.add(cpb, BorderLayout.CENTER);
p.add(b, BorderLayout.SOUTH);
//显示面板
GUIUtil.showPanel(p);
//给按钮加监听
b.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
new SwingWorker() {
@Override
protected Object doInBackground() throws Exception {
for (int i = 0; i < 100; i++) {
cpb.setProgress(i + 1);
cpb.setForegroundColor(ColorUtil.getByPercentage(i + 1));
try {
Thread.sleep(100);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
return null;
}
}.execute();
}
});
}
}
HOW2J公众号,关注后实时获知最新的教程和优惠活动,谢谢。
问答区域
2021-12-22
没有代码
2020-08-03
用了idea之后,会显示cpd变量应定义为最终变量
2 个答案
newbeeee 跳转到问题位置 答案时间:2020-08-07 貌似是一个同步的问题 内部类调用的外部变量 为了保证和内部类调用的是同一个变量 干脆加上粗暴的加上final
how2j 跳转到问题位置 答案时间:2020-08-04 在匿名类章节有关于final的讲解,参考一下:
https://how2j.cn/k/interface-inheritance/interface-inheritance-inner-class/322.html#step785
回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
2020-05-31
CircleProgressBar类的成员函数很多都调用了repaint方法,repaint方法在哪里定义的?
2020-01-06
为什么我的环形进度条有问题?
2019-03-16
改如何去学习这个项目???
提问太多,页面渲染太慢,为了加快渲染速度,本页最多只显示几条提问。还有 9 条以前的提问,请 点击查看
提问之前请登陆
提问已经提交成功,正在审核。 请于 我的提问 处查看提问记录,谢谢
|