how2j.cn

步骤 1 : 练习-为空判断   
步骤 2 : 答案-为空判断   
步骤 3 : 练习-数字校验   
步骤 4 : 答案-数字校验   
步骤 5 : 练习-账号密码验证   
步骤 6 : 答案-账号密码验证   
步骤 7 : 练习-黄鹤   
步骤 8 : 答案-黄鹤   
步骤 9 : 练习-复利计算器   
步骤 10 : 答案-复利计算器   
步骤 11 : 练习-进度条   
步骤 12 : 答案-进度条   
步骤 13 : 练习-显示文件夹复制进度条   
步骤 14 : 答案-显示文件夹复制进度条   

步骤 1 :

练习-为空判断

edit  姿势不对,事倍功半! 点击查看做练习的正确姿势
在JTextField中输入数据,在旁边加一个按钮JButton,当点击按钮的时候,判断JTextFiled中有没有数据,并使用JOptionPane进行提示
练习-为空判断
步骤 2 :

答案-为空判断

edit
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
查看本答案会花费2个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法 或者一次性购买JAVA 中级总计0个答案 (总共需要0积分)
查看本答案会花费2个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法 或者一次性购买JAVA 中级总计0个答案 (总共需要0积分)
账号未激活 账号未激活,功能受限。 请点击激活
本视频是解读性视频,所以希望您已经看过了本答案的内容,带着疑问来观看,这样收获才多。 不建议一开始就观看视频

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


package gui; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JTextField; import com.sun.org.apache.xerces.internal.util.SynchronizedSymbolTable; public class TestGUI { public static void main(String[] args) { JFrame f = new JFrame("LoL"); f.setSize(400, 300); f.setLocation(200, 200); f.setLayout(new FlowLayout()); JTextField tf = new JTextField(); tf.setPreferredSize(new Dimension(80,30)); JButton b = new JButton("检测"); b.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { String text = tf.getText(); if(0==text.length()){ JOptionPane.showMessageDialog(f, "文本内容为空"); tf.grabFocus(); } } }); f.add(tf); f.add(b); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); } }
步骤 3 :

练习-数字校验

edit  姿势不对,事倍功半! 点击查看做练习的正确姿势
在JTextField中输入数据,在旁边加一个按钮JButton,当点击按钮的时候,判断JTextFiled中的数据是否是数字,并使用JOptionPane进行提示
练习-数字校验
步骤 4 :

答案-数字校验

edit
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
查看本答案会花费2个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法 或者一次性购买JAVA 中级总计0个答案 (总共需要0积分)
查看本答案会花费2个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法 或者一次性购买JAVA 中级总计0个答案 (总共需要0积分)
账号未激活 账号未激活,功能受限。 请点击激活
本视频是解读性视频,所以希望您已经看过了本答案的内容,带着疑问来观看,这样收获才多。 不建议一开始就观看视频

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


package gui; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JTextField; import com.sun.org.apache.xerces.internal.util.SynchronizedSymbolTable; public class TestGUI { public static void main(String[] args) { JFrame f = new JFrame("LoL"); f.setSize(400, 300); f.setLocation(200, 200); f.setLayout(new FlowLayout()); JTextField tf = new JTextField(); tf.setPreferredSize(new Dimension(80,30)); JButton b = new JButton("检测"); b.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { String text = tf.getText(); try { Integer.parseInt(text); } catch (NumberFormatException e1) { JOptionPane.showMessageDialog(f, "输入框内容不是整数"); tf.grabFocus(); } } }); f.add(tf); f.add(b); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); } }
步骤 5 :

练习-账号密码验证

edit  姿势不对,事倍功半! 点击查看做练习的正确姿势
准备两个JTextFiled,一个用于输入账号,一个用于输入密码。

再准备一个JButton,上面的文字是登陆

点击按钮之后,首先进行为空判断,如果都不为空,则把账号和密码,拿到数据库中进行比较(SQL语句判断账号密码是否正确),根据判断结果,使用JOptionPane进行提示。
练习-账号密码验证
步骤 6 :

答案-账号密码验证

edit
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
查看本答案会花费4个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法 或者一次性购买JAVA 中级总计0个答案 (总共需要0积分)
查看本答案会花费4个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法 或者一次性购买JAVA 中级总计0个答案 (总共需要0积分)
账号未激活 账号未激活,功能受限。 请点击激活
本视频是解读性视频,所以希望您已经看过了本答案的内容,带着疑问来观看,这样收获才多。 不建议一开始就观看视频

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


package gui; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JPasswordField; import javax.swing.JTextField; public class TestGUI { public static void main(String[] args) { JFrame f = new JFrame("LoL"); f.setSize(400, 300); f.setLocation(200, 200); JPanel pNorth = new JPanel(); pNorth.setLayout(new FlowLayout()); JPanel pCenter = new JPanel(); JLabel lName = new JLabel("账号:"); JTextField tfName = new JTextField(""); tfName.setText(""); tfName.setPreferredSize(new Dimension(80, 30)); JLabel lPassword = new JLabel("密码:"); JPasswordField tfPassword = new JPasswordField(""); tfPassword.setText(""); tfPassword.setPreferredSize(new Dimension(80, 30)); pNorth.add(lName); pNorth.add(tfName); pNorth.add(lPassword); pNorth.add(tfPassword); JButton b= new JButton("登陆"); pCenter.add(b); b.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { String name = tfName.getText(); String password = new String( tfPassword.getPassword()); if(0==name.length()){ JOptionPane.showMessageDialog(f, "账号不能为空"); tfName.grabFocus(); return; } if(0==password.length()){ JOptionPane.showMessageDialog(f, "密码不能为空"); tfPassword.grabFocus(); return; } if(check(name, password)) JOptionPane.showMessageDialog(f, "登陆成功"); else JOptionPane.showMessageDialog(f, "密码错误"); } }); f.setLayout(new BorderLayout()); f.add(pNorth,BorderLayout.NORTH); f.add(pCenter,BorderLayout.CENTER); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); } public static boolean check(String name, String password) { try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } boolean result = false; try (Connection c = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/how2java?characterEncoding=UTF-8", "root", "admin"); Statement s = c.createStatement(); ) { String sql = "select * from user where name = '" + name +"' and password = '" + password+"'"; // 执行查询语句,并把结果集返回给ResultSet ResultSet rs = s.executeQuery(sql); if(rs.next()) result = true; } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return result; } }
步骤 7 :

练习-黄鹤

edit  姿势不对,事倍功半! 点击查看做练习的正确姿势
练习-黄鹤改成Swing来完成

要有为空和数字判断
练习-黄鹤
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
查看本答案会花费4个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法 或者一次性购买JAVA 中级总计0个答案 (总共需要0积分)
查看本答案会花费4个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法 或者一次性购买JAVA 中级总计0个答案 (总共需要0积分)
账号未激活 账号未激活,功能受限。 请点击激活
本视频是解读性视频,所以希望您已经看过了本答案的内容,带着疑问来观看,这样收获才多。 不建议一开始就观看视频

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


package gui; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextArea; import javax.swing.JTextField; public class TestGUI { public static void main(String[] args) { JFrame f = new JFrame("LoL"); f.setSize(400, 400); f.setLocation(200, 200); int gap = 10; JPanel pInput = new JPanel(); pInput.setLayout(new GridLayout(4, 3, gap, gap)); JLabel lLocation = new JLabel("地名:"); JTextField tfLocation = new JTextField(""); JLabel lType = new JLabel("公司类型:"); JTextField tfType = new JTextField(""); JLabel lCompanyName = new JLabel("公司名称:"); JTextField tfCompanyName = new JTextField(""); JLabel lBossName = new JLabel("老板名称:"); JTextField tfBossName = new JTextField(""); JLabel lMoney = new JLabel("金额:"); JTextField tfMoney = new JTextField(""); JLabel lProduct = new JLabel("产品:"); JTextField tfProduct = new JTextField(""); JLabel lUnit = new JLabel("价格计量单位"); JTextField tfUnit = new JTextField(""); pInput.add(lLocation); pInput.add(tfLocation); pInput.add(lType); pInput.add(tfType); pInput.add(lCompanyName); pInput.add(tfCompanyName); pInput.add(lBossName); pInput.add(tfBossName); pInput.add(lMoney); pInput.add(tfMoney); pInput.add(lProduct); pInput.add(tfProduct); pInput.add(lUnit); pInput.add(tfUnit); f.setLayout(null); pInput.setBounds(gap, gap, 375, 120); JButton b = new JButton("生成"); JTextArea ta = new JTextArea(); ta.setLineWrap(true); b.setBounds(150, 120 + 30, 80, 30); ta.setBounds(gap, 150 + 60, 375, 120); f.add(pInput); f.add(b); f.add(ta); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); b.addActionListener(new ActionListener() { boolean checkedpass = true; @Override public void actionPerformed(ActionEvent e) { checkedpass = true; checkEmpty(tfLocation,"地址"); checkEmpty(tfType,"公司类型"); checkEmpty(tfCompanyName,"公司名称"); checkEmpty(tfBossName,"老板姓名"); checkNumber(tfMoney,"金额"); checkEmpty(tfProduct,"产品"); checkEmpty(tfUnit,"价格计量单位"); String location = tfLocation.getText(); String type = tfType.getText(); String companyName = tfCompanyName.getText(); String bossName = tfBossName.getText(); String money = tfMoney.getText(); String product = tfProduct.getText(); String unit = tfUnit.getText(); if(checkedpass){ String model = "%s最大%s%s倒闭了,王八蛋老板%s吃喝嫖赌,欠下了%s个亿," + "带着他的小姨子跑了!我们没有办法,拿着%s抵工资!原价都是一%s多、两%s多、三%s多的%s," + "现在全部只卖二十块,统统只要二十块!%s王八蛋,你不是人!我们辛辛苦苦给你干了大半年," + "你不发工资,你还我血汗钱,还我血汗钱!"; String result= String.format(model, location,type,companyName,bossName,money,product,unit,unit,unit,product,bossName); ta.setText(""); ta.append(result); } } private void checkNumber(JTextField tf, String msg) { if(!checkedpass) return; String value = tf.getText(); try { Integer.parseInt(value); } catch (NumberFormatException e) { JOptionPane.showMessageDialog(f, msg + " 必须是整数"); tf.grabFocus(); checkedpass = false; } } private void checkEmpty(JTextField tf, String msg) { if(!checkedpass) return; String value = tf.getText(); if(0==value.length()){ JOptionPane.showMessageDialog(f, msg + " 不能为空"); tf.grabFocus(); checkedpass = false; } } }); } }
步骤 9 :

练习-复利计算器

edit  姿势不对,事倍功半! 点击查看做练习的正确姿势
参考练习-百万富翁,把 网页版的复利计算器 改成swing来做

复利公式:
F = p* ( (1+r)^n );
F 最终收入
p 本金
r 年利率
n 存了多少年

假设情景一:
p = 10000
r = 0.05
n = 1

解读:
本金是10000
年利率是5%
存了一年 1次
复利收入 10000*( (1+0.05)^1 ) = 10500

假设情景二:
p = 10000
r = 0.05
n = 2

解读:
本金是10000
年利率是5%
存了两年
复利收入 10000*( (1+0.05)^2 ) = 11025
练习-复利计算器
步骤 10 :

答案-复利计算器

edit
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
查看本答案会花费4个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法 或者一次性购买JAVA 中级总计0个答案 (总共需要0积分)
查看本答案会花费4个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法 或者一次性购买JAVA 中级总计0个答案 (总共需要0积分)
账号未激活 账号未激活,功能受限。 请点击激活
本视频是解读性视频,所以希望您已经看过了本答案的内容,带着疑问来观看,这样收获才多。 不建议一开始就观看视频

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


package gui; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextArea; import javax.swing.JTextField; @SuppressWarnings("unused") public class TestGUI { public static void main(String[] args) { JFrame f = new JFrame("LoL"); f.setLayout(null); f.setSize(400, 400); f.setLocation(200, 200); int gap = 10; JPanel pInput = new JPanel(); pInput.setLayout(new GridLayout(4, 6, gap, gap)); pInput.setBounds(gap, gap, 375, 120); JLabel lInit =new JLabel("起始资金"); JLabel lRate =new JLabel("每年收益"); JLabel lYear =new JLabel("复利年数"); JLabel lInverst=new JLabel("每年追加资金"); JTextField tfInit = new JTextField("12000"); JTextField tfRate = new JTextField("20"); JTextField tfYear = new JTextField("2"); JTextField tfInvest = new JTextField("12000"); JLabel lInitSign =new JLabel("¥"); JLabel lRateSign =new JLabel("%"); JLabel lYearSign =new JLabel("年"); JLabel lInvestSign =new JLabel("¥"); pInput.add(lInit); pInput.add(tfInit); pInput.add(lInitSign); pInput.add(lRate); pInput.add(tfRate); pInput.add(lRateSign); pInput.add(lYear); pInput.add(tfYear); pInput.add(lYearSign); pInput.add(lInverst); pInput.add(tfInvest); pInput.add(lInvestSign); JPanel pResult = new JPanel(); pResult.setLayout(new GridLayout(4, 6, gap, gap)); JLabel lBaseSum =new JLabel("本金和"); JLabel lInterestSum =new JLabel("利息和"); JLabel lTotalSum =new JLabel("本息和"); JTextField tfBaseSum = new JTextField(); JTextField tfInterestSum = new JTextField(); JTextField tfTotalSum = new JTextField(); JLabel lBaseSumSign =new JLabel("¥"); JLabel lInterestSumSign =new JLabel("¥"); JLabel lTotalSumSign =new JLabel("¥"); pResult.add(lBaseSum); pResult.add(tfBaseSum); pResult.add(lBaseSumSign); pResult.add(lInterestSum); pResult.add(tfInterestSum); pResult.add(lInterestSumSign); pResult.add(lTotalSum); pResult.add(tfTotalSum); pResult.add(lTotalSumSign); JButton b = new JButton("计算"); b.setBounds(150, 120 + 30, 80, 30); pResult.setBounds(gap, 150 + 60, 375, 120); f.add(pInput); f.add(b); f.add(pResult); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); b.addActionListener(new ActionListener() { boolean checkedpass = true; @Override public void actionPerformed(ActionEvent e) { checkedpass = true; check(tfInit,"起始资金"); check(tfRate,"每年收益"); check(tfYear,"复利年数"); check(tfInvest,"每年追加资金"); if(checkedpass){ int init = Integer.parseInt(tfInit.getText()); int rate = Integer.parseInt(tfRate.getText()); int year = Integer.parseInt(tfYear.getText()); int invest = Integer.parseInt(tfInvest.getText()); int baseSum = (year-1)*invest+init; int totalSum=(int) (invest* fuli( (1+(double)rate/100),(year-1)) + init* Math.pow((1+(double)rate/100) ,year)); int interestSum = totalSum -baseSum; tfBaseSum.setText(String.format("%,d",baseSum)); tfInterestSum.setText(String.format("%,d",interestSum)); tfTotalSum.setText(String.format("%,d",totalSum)); } } private int fuli(double rate, int year){ int result = 0; for(int i=year;i>0;i--){ result+=Math.pow(rate,i); } return result; } private void check(JTextField tf, String msg) { if(!checkedpass) return; String value = tf.getText(); if(0==value.length()){ JOptionPane.showMessageDialog(f, msg + " 不能为空"); tf.grabFocus(); checkedpass = false; return; } try { Integer.parseInt(value); } catch (NumberFormatException e) { JOptionPane.showMessageDialog(f, msg + " 必须是整数"); tf.grabFocus(); checkedpass = false; } } }); } }
步骤 11 :

练习-进度条

edit  姿势不对,事倍功半! 点击查看做练习的正确姿势
设计一个线程,每隔100毫秒,就把进度条的进度+1。

从0%一直加到100%

刚开始加的比较快,以每隔100毫秒的速度增加,随着进度的增加,越加越慢,让处女座的使用者,干着急

变得多慢,根据你们和处女座同学,朋友的相处体验,自己把控
练习-进度条
步骤 12 :

答案-进度条

edit
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
查看本答案会花费4个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法 或者一次性购买JAVA 中级总计0个答案 (总共需要0积分)
查看本答案会花费4个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法 或者一次性购买JAVA 中级总计0个答案 (总共需要0积分)
账号未激活 账号未激活,功能受限。 请点击激活
本视频是解读性视频,所以希望您已经看过了本答案的内容,带着疑问来观看,这样收获才多。 不建议一开始就观看视频

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


package gui; import java.awt.Dimension; import java.awt.FlowLayout; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JProgressBar; import javax.swing.JTextArea; public class TestGUI { public static void main(String[] args) { JFrame f = new JFrame("LoL"); f.setSize(400, 300); f.setLocation(200, 200); f.setLayout(new FlowLayout()); JProgressBar pb = new JProgressBar(); pb.setMaximum(100); pb.setValue(0); pb.setStringPainted(true); new Thread(){ public void run(){ int sleep = 100; for (int i = 0; i < 100; i++) { pb.setValue(i+1); try { Thread.sleep(sleep+ i*10); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }.start(); f.add(pb); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); } }
步骤 13 :

练习-显示文件夹复制进度条

edit  姿势不对,事倍功半! 点击查看做练习的正确姿势
改进练习-复制文件夹提供进度条,把文件复制的进度显示出来。
练习-显示文件夹复制进度条
步骤 14 :

答案-显示文件夹复制进度条

edit
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
查看本答案会花费5个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法 或者一次性购买JAVA 中级总计0个答案 (总共需要0积分)
查看本答案会花费5个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法 或者一次性购买JAVA 中级总计0个答案 (总共需要0积分)
账号未激活 账号未激活,功能受限。 请点击激活
本视频是解读性视频,所以希望您已经看过了本答案的内容,带着疑问来观看,这样收获才多。 不建议一开始就观看视频

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


package gui; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JProgressBar; import javax.swing.JTextField; public class TestGUI { static long allFileSize = 0; // 所有需要复制的文件大小 static long currentFileSizeCopied = 0;// 已复制的文件总大小 /** * 遍历文件夹获取文件夹内容总大小 * * @param file */ public static void calclateAllFilesize(File file) { if (file.isFile()) { allFileSize += file.length(); } if (file.isDirectory()) { File[] fs = file.listFiles(); for (File f : fs) { calclateAllFilesize(f); } } } public static void main(String[] args) { JFrame f = new JFrame("带进度条的文件夹复制"); f.setSize(450, 140); f.setLocation(200, 200); f.setLayout(new FlowLayout()); // 文件地址 JLabel lStr = new JLabel("源文件地址:"); JTextField strTf = new JTextField(""); strTf.setText("e:/JDK"); strTf.setPreferredSize(new Dimension(100, 30)); JLabel lDest = new JLabel("复制到:"); JTextField destTf = new JTextField(""); destTf.setText("e:/JDK2"); destTf.setPreferredSize(new Dimension(100, 30)); f.add(lStr); f.add(strTf); f.add(lDest); f.add(destTf); JButton bStartCopy = new JButton("开始复制"); bStartCopy.setPreferredSize(new Dimension(100, 30)); JLabel l = new JLabel("文件复制进度:"); JProgressBar pb = new JProgressBar(); pb.setMaximum(100); pb.setStringPainted(true); f.add(bStartCopy); f.add(l); f.add(pb); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); // 计算需要复制的文件的总大小 String srcPath = strTf.getText(); File folder = new File(srcPath); calclateAllFilesize(folder); // 点击开始复制 bStartCopy.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { currentFileSizeCopied = 0; String srcPath = strTf.getText(); String destPath = destTf.getText(); new Thread(() -> copyFolder(srcPath, destPath)).start(); bStartCopy.setEnabled(false); } public void copyFile(String srcPath, String destPath) { File srcFile = new File(srcPath); File destFile = new File(destPath); // 缓存区,一次性读取1024字节 byte[] buffer = new byte[1024]; try (FileInputStream fis = new FileInputStream(srcFile); FileOutputStream fos = new FileOutputStream(destFile);) { while (true) { // 实际读取的长度是 actuallyReaded,有可能小于1024 int actuallyReaded = fis.read(buffer); // -1表示没有可读的内容了 if (-1 == actuallyReaded) break; fos.write(buffer, 0, actuallyReaded); fos.flush(); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public void copyFolder(String srcPath, String destPath) { File srcFolder = new File(srcPath); File destFolder = new File(destPath); if (!srcFolder.exists()) return; if (!srcFolder.isDirectory()) return; if (destFolder.isFile()) return; if (!destFolder.exists()) destFolder.mkdirs(); File[] files = srcFolder.listFiles(); for (File srcFile : files) { if (!(srcFile.isDirectory())) { File newDestFile = new File(destFolder, srcFile.getName()); copyFile(srcFile.getAbsolutePath(), newDestFile.getAbsolutePath()); currentFileSizeCopied += srcFile.length(); double current = (double) currentFileSizeCopied / (double) allFileSize; int progress = (int) (current * 100); pb.setValue(progress); if (progress == 100) { JOptionPane.showMessageDialog(f, "复制完毕"); bStartCopy.setEnabled(true); } } if (srcFile.isDirectory()) { File newDestFolder = new File(destFolder, srcFile.getName()); copyFolder(srcFile.getAbsolutePath(), newDestFolder.getAbsolutePath()); } } } }); } }


HOW2J公众号,关注后实时获知最新的教程和优惠活动,谢谢。


问答区域    
2023-09-04 练习-显示文件夹复制进度条
旧时亭台阁




预处理一下要复制的文件
import javax.swing.*;
import java.awt.*;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

public class App {
    public static void main(String[] args) throws Exception {
        JFrame frame = new JFrame("练习");
        frame.setLocation(700, 150);
        frame.setSize(400, 400);
        frame.setLayout(new FlowLayout());

        JLabel label1 = new JLabel("源文件地址:");
        JTextField textField1 = new JTextField(30);
        frame.add(label1);
        frame.add(textField1);

        JLabel label2 = new JLabel("复制到:");
        JTextField textField2 = new JTextField(30);
        frame.add(label2);
        frame.add(textField2);

        JButton button = new JButton("开始复制");
        frame.add(button);

        JLabel label3 = new JLabel("文件复制进度:");
        frame.add(label3);

        JProgressBar progressBar = new JProgressBar(JProgressBar.HORIZONTAL, 0, 100);
        progressBar.setStringPainted(true);
        frame.add(progressBar);

        // 开始复制,事件响应
        button.addActionListener(e -> {
            File srcFolder = new File(textField1.getText());
            File dstFolder = new File(textField2.getText());

            // 预处理:计算总共要复制多少个文件
            Map<File, File> map = new HashMap<>();
            preHandle(srcFolder, dstFolder, map);

           // 复制文件
            int total = map.size(), cur = 0;
            for (Map.Entry<File, File> entry : map.entrySet()) {
                copyFile(entry.getKey(), entry.getValue());
                progressBar.setValue((++cur / total) * 100);
            }
        });

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }

    public static void preHandle(File srcFolder, File dstFolder, Map<File, File> map) {
        for (File file : srcFolder.listFiles()) {
            if (file.isFile()) {
                map.put(file, new File(dstFolder, file.getName()));
            } else {
                preHandle(file, new File(dstFolder, file.getName()), map);
            }
        }
    }


    public static void copyFile(File src, File dst) {
        dst.getParentFile().mkdirs();

        try {
            FileInputStream fis = new FileInputStream(src);
            FileOutputStream fos = new FileOutputStream(dst);

            byte[] buf = new byte[1024];
            int len;
            while (-1 != (len = fis.read(buf))) {
                fos.write(buf, 0, len);
            }

            fis.close();
            fos.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

    }
}

							





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





2021-12-16 练习 - 显示文件夹复制进度条
莫諾




改进练习 - 复制文件夹提供进度条,把文件复制的进度显示出来。
加载中
		Thread t1= new Thread(){
			public void run(){
				int pbar =0;
                int sec = 100;
				File ff = new File(sfAddr.getText());
				File df = new File(dfAddr.getText());
				String[] s = ff.list();
				File[] fl = new File[s.length];
				File[] dl = new File[s.length];
				for (int i = 0; i < s.length; i++) {
					fl[i] = new File(ff.getAbsoluteFile() + "/" + s[i]);
				    dl[i] = new File(df.getAbsoluteFile() + "/" + s[i]);
					if (fl[i].isFile()) 
						copyFiletoDst(fl[i], dl[i]);
					if (fl[i].isDirectory()) { 
						dl[i].mkdirs();
						copyFolderAndFiletoDst(fl[i],dl[i]);
					}
                    try {
                    	if(s.length <= 100) {
	                    	pbar += 100/(s.length);
                    	} else {
                    		pbar += (s.length)/100;
                    	}
                    	// 当前...
                		pb.setValue(pbar);
                		pb.setStringPainted(true);
                		pb.setVisible(true);
                        Thread.sleep(sec);
                        if (pbar >10) 
                        	sec += 5;
                		
                    } catch (InterruptedException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                    }
                    if(pbar < 101)
                    	System.out.printf("文件当前进度在百分之%d %n", pbar);             
			    }
				pbar = 100;
				// 当前...
        		pb.setValue(pbar);
        		pb.setStringPainted(true);
				System.out.printf("文件当前进度在百分之%d %n", pbar); 
			}
        };
        tCopy.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
                t1.start();
			}
		});

public static void copyFolderAndFiletoDst(File srcF, File destF){...}
public static void copyFiletoDst(File srcF, File destF){...}
public static String[] readTem(File f){...}
private static void write(String[] s,File f){...}
public static void copyFile(String[] srcFile, String[] destFile, File destF){...}

							





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





2021-12-13 练习 - 进度条
2021-12-12 练习 - 复利计算器
2021-11-24 练习 - 数字校验


提问太多,页面渲染太慢,为了加快渲染速度,本页最多只显示几条提问。还有 47 条以前的提问,请 点击查看

提问之前请登陆
提问已经提交成功,正在审核。 请于 我的提问 处查看提问记录,谢谢
关于 JAVA 中级-图形界面-组件综合练习 的提问

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

上传截图