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公众号,关注后实时获知最新的教程和优惠活动,谢谢。


问答区域    
2024-07-16 基于 GUI 完成综合测试部分习题
虚心求学




1.文字检测测试(是否为空) 2.用户登录测试 3.缓慢进度条测试 4.文件复制进度练习
加载中
package testGUI;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Panel;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ConnectException;
import java.nio.charset.StandardCharsets;
import java.sql.Connection;
import java.sql.PreparedStatement;

import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JProgressBar;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;

import testJDBC.testDataBase;

public class TestUI {
	public static void main(String[] args) {
		JFrame frame = new JFrame("文本测试");
		frame.setSize(800, 500);
		frame.setLocation(200, 100);
		JTabbedPane tabs = new JTabbedPane();
		// 第一页
		tabs.addTab("文字检测测试", getPage1(frame));

		// 第二页(用户登录测试)
		getPage2(frame, tabs);

		// 第三页(缓慢进度条测试)
		getPage3(frame, tabs);

		//第四页(文件复制进度练习)
		getPage4(frame,tabs);
		
		frame.add(tabs);
		frame.setContentPane(tabs);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}

	
	public static JPanel getPage1(JFrame f) {
		// page1
		JPanel p1 = new JPanel();
		p1.setLayout(new FlowLayout());
		JTextField txt = new JTextField();
		JButton btn = new JButton();
		btn.setText("检测");
		btn.addActionListener((e) -> {
			String text = txt.getText();
			if (isNullOrEmpty(text))
				JOptionPane.showMessageDialog(f, "输入内容不能为空!");
			else if (!text.matches("\\d+"))
				JOptionPane.showMessageDialog(f, "输入的内容不是整数!");
		});
		p1.add(txt);
		txt.setPreferredSize(new Dimension(100, 30));
		txt.setFont(new Font("Microsoft YaHei", Font.PLAIN, 18));
		txt.setHorizontalAlignment(JTextField.CENTER);
		p1.add(btn);
		return p1;
	}

	public static void getPage2(JFrame f, JTabbedPane tabs) {
		// page2
		JPanel p1 = new JPanel();
		p1.setLayout(new FlowLayout());
		JLabel lalname = new JLabel("账号:");
		JLabel lalcode = new JLabel("密码:");
		JTextField txtName = new JTextField();
		JPasswordField txtCode = new JPasswordField();

		JPanel p2 = new JPanel();
		p2.setLayout(new FlowLayout());
		JButton btn = new JButton();
		btn.setText("登录");
		btn.addActionListener((e) -> {
			String text = txtName.getText();
			String code = new String(txtCode.getPassword());
			if (isNullOrEmpty(text) || isNullOrEmpty(txtCode.getPassword()))
				JOptionPane.showMessageDialog(f, "输入内容不能为空!");
			else {
				try (Connection c = testDataBase.getConnetion();
						PreparedStatement ps = c
								.prepareStatement("select * from user where name = ? and password = ? limit 1")) {
					ps.setString(1, text);
					ps.setString(2, code);
					ps.execute();
					if (ps.getResultSet().next())
						JOptionPane.showMessageDialog(f, "密码正确,登录成功!");
					else {
						JOptionPane.showMessageDialog(f, "账号或密码错误!");
					}
				} catch (Exception e2) {
					e2.printStackTrace();
				}
			}
		});

		txtName.setPreferredSize(new Dimension(100, 30));
		txtCode.setPreferredSize(new Dimension(100, 30));
		txtName.setFont(new Font("Microsoft YaHei", Font.PLAIN, 18));
		txtName.setHorizontalAlignment(JTextField.CENTER);
		txtCode.setFont(new Font("Microsoft YaHei", Font.PLAIN, 18));
		txtCode.setHorizontalAlignment(JTextField.CENTER);
		p1.add(lalname);
		p1.add(txtName);
		p1.add(lalcode);
		p1.add(txtCode);
		p2.add(btn);
		JPanel all = new JPanel();
		all.setLayout(new BorderLayout());
		all.add(p1, BorderLayout.NORTH);
		all.add(p2, BorderLayout.CENTER);
		tabs.addTab("账号密码验证测试", all);

	}

	public static void getPage3(JFrame f, JTabbedPane tabs) {
		JProgressBar bar = new JProgressBar();
		bar.setMaximum(100);
		bar.setValue(0);
		bar.setStringPainted(true);
		JPanel p = new JPanel();
		p.setLayout(new FlowLayout());
		final int[] intervew = new int[] { 50 };
		new Thread(() -> {
			while (bar.getValue() < bar.getMaximum()) {
				bar.setValue(bar.getValue() + 1);
				if (bar.getValue() > bar.getMaximum() / 2)
					intervew[0] += 10;
				if (bar.getValue() > bar.getMaximum() * 2 / 3)
					intervew[0] += 50;
				if (bar.getValue() > bar.getMaximum() * 4 / 5)
					intervew[0] += 100;
				try {
					Thread.sleep(intervew[0]);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}).start();
		p.add(bar);
		tabs.addTab("进度条测试", p);
	}

	public static void getPage4(JFrame f, JTabbedPane tabs) {
		JPanel p1 = new JPanel();
		p1.setLayout(new FlowLayout());
		JPanel p2 = new JPanel();
		p2.setLayout(new FlowLayout());
		JLabel lalSrc = new JLabel("源文件地址:");
		JLabel lalDest = new JLabel("复制到:");
		JTextField txtSrc = new JTextField("E:/wgxFolder/copysrc/src");
		JTextField txtDest = new JTextField("E:/wgxFolder/copysrc/src2");
		JProgressBar bar = new JProgressBar();


		bar.setStringPainted(true);
		JButton btn = new JButton();
		btn.setText("开始复制");
		JLabel lalState = new JLabel("文件复制进度");
		p2.add(btn);
		p2.add(lalState);

		btn.addActionListener((e) -> {
			String src = txtSrc.getText();
			String dest = txtDest.getText();
			File folder = new File(src);
			
			bar.setMaximum(getCount(folder,new int[]{0}));
			if (isNullOrEmpty(src) || isNullOrEmpty(dest))
				JOptionPane.showMessageDialog(f, "输入内容不能为空!");
			else {
				bar.setValue(0);
				new Thread(() -> {
					copyFolder(src,dest,bar);
				}).start();
			}
		});
		p2.add(bar);

		txtSrc.setPreferredSize(new Dimension(160, 30));
		txtDest.setPreferredSize(new Dimension(160, 30));
		txtSrc.setFont(new Font("Microsoft YaHei", Font.PLAIN, 18));
		txtSrc.setHorizontalAlignment(JTextField.CENTER);
		txtDest.setFont(new Font("Microsoft YaHei", Font.PLAIN, 18));
		txtDest.setHorizontalAlignment(JTextField.CENTER);
		p1.add(lalSrc);
		p1.add(txtSrc);
		p1.add(lalDest);
		p1.add(txtDest);
		JPanel panelAll = new JPanel();
		panelAll.setLayout(new BorderLayout());
		panelAll.add(p1,BorderLayout.NORTH);
		panelAll.add(p2,BorderLayout.CENTER);
		tabs.addTab("复制文件测试", panelAll);
	}

	/*
	 * 将指定文件夹中的所有文件和所有子文件夹和子文件复制一个副本
	 */
	public static void copyFolder(String src, String dest,JProgressBar bar) {
		File folder = new File(src);
		if (!folder.exists()) // 防止路径不存在
			return;
		File[] fs = folder.listFiles();
		if (fs == null)
			return;
		if (fs.length < 1)
			return;
		for (File ff : folder.listFiles()) {
			String[] info = ff.getName().split("\\.");
			String name = ff.getName();
			String filter = "";
			if (info.length >= 2) {
				name = "";
				for (int i = 0; i < info.length - 1; i++) {
					name += info[i];
				}
				filter = info[info.length - 1];
			}
			copyFile(ff.getAbsolutePath(), String.format("%s/%s(copy).%s", dest, name, filter),bar);
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			bar.setValue(bar.getValue()+1);
			copyFolder(ff.getAbsolutePath(), dest,bar);// 递归copy子文件夹及子文件
		}
	}

	/*
	 * SrcFile copy/create to destFilePath
	 */
	public static void copyFile(String srcFilePath, String destFilePath,JProgressBar bar) {
		File src = new File(srcFilePath);
		if (!src.exists())
			return;// 防止目标文件的路径不存在
		File dest = new File(destFilePath);
		dest.getParentFile().mkdirs();// 防止目标文件的路径不存在
		try (InputStreamReader in = new InputStreamReader(new FileInputStream(src), StandardCharsets.UTF_8);
				BufferedReader reader = new BufferedReader(in);
				PrintWriter writer = new PrintWriter(
						new OutputStreamWriter(new FileOutputStream(dest), StandardCharsets.UTF_8))) {
			String str = "";
			while ((str = reader.readLine()) != null) {
				writer.write(String.format("%s%n", str));
			}
			System.out.println(String.format("success!%s copy to %s ", src.getName(), dest.getName()));
		} catch (Exception e) {
			// TODO: handle exception
		}
	}
	public static int getCount(File folder,int[]count)
	{
		if (!folder.exists()) // 防止路径不存在
			return 0;
		File[] fs = folder.listFiles();
		if (fs == null)
			return 0;
		if (fs.length < 1)
			return 0;
		for (File ff : folder.listFiles()) {
			count[0]++;
			getCount(ff, count);
		}
		return count[0];
	}
	public static boolean isNullOrEmpty(String str) {
		return str == null || str.isEmpty() || str.equals("");
	}

	public static boolean isNullOrEmpty(char[] cs) {
		return cs == null || cs.length < 1 || isNullOrEmpty(new String(cs));
	}
}

							





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





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 练习 - 显示文件夹复制进度条
2021-12-13 练习 - 进度条
2021-12-12 练习 - 复利计算器


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

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

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

上传截图