how2j.cn

下载区
文件名 文件大小
请先登录 342k
增值内容 342k
342k

工具版本兼容问题
在开发这个项目的时候,需要用到一个环形进度条。 但是Swing只有自带的,横向条状进度条,为了达到效果,就需要自己设计一个环形进度条



5分56秒
本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器。 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)。 chrome 的 视频下载插件会影响播放,如 IDM 等,请关闭或者切换其他浏览器

步骤 1 : 环形进度条   
步骤 2 : CircleProgressBar   
步骤 3 : 使用CircleProgressBar   

像这样,需要一个环形进度条。 因为Swing默认不提供,所以需要自己开发一个环形进度条的组件。
环形进度条
步骤 2 :

CircleProgressBar

edit
增值内容,请先登录
完整的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(); } }
步骤 3 :

使用CircleProgressBar

edit
增值内容,请先登录
完整的J2SE桌面项目,从无到有完整的开发流程,涵盖全部52个知识点,154个开发步骤, 一共36个讲解视频,累计时长3小时10分59秒,大小1.94G,充实J2SE项目经验,为简历加上一个有吸引力的砝码
增值内容,点击购买
使用爬虫已经被系统记录,请勿使用爬虫,增大封号风险。 如果是误封 ,请联系站长,谢谢
使用CircleProgressBar
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 没有代码
奋斗的小李

没有代码怎么办啊?要付费吗?




1 个答案

小陈同学
答案时间:2021-12-24
是的



回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到




2020-08-03 用了idea之后,会显示cpd变量应定义为最终变量
caole

为什么在内部类中引用外部变量时,必须声明为final呢?   最开始我想的是,会和Java的内存模型有关。因为我们都知道,带有static的变量或者方法是属于类的,也就是说,类成员是被储存在堆内存里面的。那么final是否也是这样?经过查找资料,得知:final 是保护 所修饰的类、方法、变量不能被改变的,并不占用内存。因此,并不是因为内存的关系。   真正的原因是因为生命周期的原因。方法中的局部变量,方法结束后这个变量就要释放掉,而final会保证这个变量始终指向一个对象。   首先,内部类和外部类其实是处于同一个级别,内部类不会因为定义在方法中就会随着方法的执行完毕而跟随者被销毁。问题就来了,如果外部类的方法中的变量不定义final,那么当外部类方法执行完毕的时候,这个局部变量肯定也就被GC了,然而内部类的某个方法还没有执行完,这个时候他所引用的外部变量已经找不到了。如果定义为final,java会将这个变量复制一份作为成员变量内置于内部类中,这样的话,由于final所修饰的值始终无法改变,所以这个变量所指向的内存区域就不会变。




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 条以前的提问,请 点击查看

提问之前请登陆
提问已经提交成功,正在审核。 请于 我的提问 处查看提问记录,谢谢
关于 实践项目-一本糊涂账-CircleProgressBar 的提问

尽量提供截图代码异常信息,有助于分析和解决问题。 也可进本站QQ群交流: 578362961
提问尽量提供完整的代码,环境描述,越是有利于问题的重现,您的问题越能更快得到解答。
对教程中代码有疑问,请提供是哪个步骤,哪一行有疑问,这样便于快速定位问题,提高问题得到解答的速度
在已经存在的几千个提问里,有相当大的比例,是因为使用了和站长不同版本的开发环境导致的,比如 jdk, eclpise, idea, mysql,tomcat 等等软件的版本不一致。
请使用和站长一样的版本,可以节约自己大量的学习时间。 站长把教学中用的软件版本整理了,都统一放在了这里, 方便大家下载: https://how2j.cn/k/helloworld/helloworld-version/1718.html

上传截图