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


问答区域    
2021-04-27 黄鹤答案
thixin




我的答案展示
public static void main(String[] args) {

        JFrame f = new JFrame("王八蛋老板");
        f.setLayout(new FlowLayout());
        f.setSize(500,500);
        JPanel p1 = new JPanel(new FlowLayout(FlowLayout.CENTER,10,15));
        p1.setPreferredSize(new Dimension(480,250));
        //p1.setBackground(Color.CYAN);
        f.add(p1);
        JTextField tf_dname = makePlan("地名 : ",p1);
        JTextField tf_copyType = makePlan("公司类型 : ", p1);
        JTextField tf_copyName = makePlan("公司名称 : ", p1);
        JTextField tf_boosName = makePlan("老板名称 : ", p1);
        JTextField tf_monkey = makePlan("金额 : ", p1);
        JTextField tf_thing = makePlan("产品名称 : ", p1);
        JTextField tf_danwei = makePlan("计价单位 : ", p1);
        JLabel label = new JLabel("                                       "  + "                                   ");
        p1.add(label);

        JButton b = new JButton("生成");
        b.setPreferredSize(new Dimension(100,40));
        p1.add(b);

        JTextArea area = new JTextArea();
        area.setPreferredSize(new Dimension(480,200));
        f.add(area);

        // 绑定按键事件
        b.addActionListener(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String txt = tf_dname.getText() + "最大" + tf_copyType.getText() + tf_copyName.getText() +  "倒闭了,王八蛋老板" + tf_boosName.getText()+ "吃喝嫖赌,欠下了" + tf_monkey.getText() +"个亿 ," +
                        "带着他的小姨子跑了!我们没有办法,拿着" + tf_thing.getText() + "抵工资!原价都是一"+ tf_danwei.getText() +"多、两" + tf_danwei.getText() +"多、三" + tf_danwei.getText() +"多的" + tf_thing.getText() + "," +
                        "现在全部只卖二十块,统统只要二十块!"+tf_boosName.getText()+"王八蛋,你不是人!我们辛辛苦苦给你干了大半年,你不发工资," +
                        "你还我血汗钱,还我血汗钱!";

                area.append(txt);
                area.setLineWrap(true);
            }

        });


        f.setResizable(false); // 设置窗口不可调整
        f.setLocationRelativeTo(null);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);


    }

    private static JTextField makePlan(String txt, JPanel panel) {
        JPanel jPanel = new JPanel();
        jPanel.setLayout(new GridLayout(1,2));
        JLabel label = new JLabel(txt);
        JTextField textField = new JTextField();
        jPanel.add(label);
        jPanel.add(textField);
        jPanel.setPreferredSize(new Dimension(220,25));
        //jPanel.setBackground(Color.PINK);
        panel.add(jPanel);
        return textField;
    }

							


2 个答案

疾風亦有歸途
答案时间:2021-08-10
連接數據庫 查看賬號密碼輸入是否正確

萌森
答案时间:2021-05-11



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





2020-12-31 最后一题
yanpengyun




交作业最后一题
package file;
import java.awt.Dimension;
import java.awt.GridLayout;
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.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JTextField;
public class TestFile{
	
	static long srcFileTollay = 0;
	static long copyFileTollay = 0;
	
	public static void main(String[] args) {
		JFrame f = new JFrame("lol");
		f.setSize(400,200);
		f.setLocation(200, 200);
		f.setLayout(null);
		
		JPanel pInput = new JPanel();
		pInput.setLayout(new GridLayout(1,4,10,10));
		pInput.setBounds(10, 10, 380, 40);
		
		JLabel lsrcPath = new JLabel("源文件地址:");
		JTextField tfSrcPath =  new JTextField("");
		
		JLabel ldestPath = new JLabel("复制到:");
		JTextField tfdestPath =  new JTextField("");
		
		pInput.add(lsrcPath);
		pInput.add(tfSrcPath);
		pInput.add(ldestPath);
		pInput.add(tfdestPath);
		
		JButton b = new JButton("开始复制");
		b.setBounds(10, 10+40+20, 150, 40);
		
		JLabel lProgress = new JLabel("文件复制进度");
		lProgress.setBounds(10+150+10, 10+40+20, 100, 40);
		
		JProgressBar pb = new JProgressBar();
		pb.setSize(new Dimension(180,40));
		pb.setLocation(10+150+10+100+10, 10+40+20);
		pb.setMaximum(100);
		pb.setStringPainted(true);
		
		f.add(pInput);
		f.add(b);
		f.add(lProgress);
		f.add(pb);
		
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.setVisible(true);
		
		b.addActionListener(new ActionListener(){
			
			public  long getLength(String srcPath,String destPath){
			      File srcFile = new File(srcPath);
			      File destFile = new File(srcPath);
			      
			      File[]files = srcFile.listFiles();
			      for(File eachFile : files){
			    	  if(eachFile.isFile())
			    		  srcFileTollay+=eachFile.length();
			    	  if(eachFile.isDirectory()){
			              File newDestFile = new File(destFile,eachFile.getName());    		  
			    		  getLength(eachFile.getAbsolutePath(),newDestFile.getAbsolutePath());
			    	  }
			      }
			      return srcFileTollay;
			      
				}
				
				public  void copyFolder(String srcPath,String destPath){
					File srcFile = new File(srcPath);
					File destFile = new File(destPath);
					if(!srcFile.exists())
					    return;
					if(srcFile.isFile())
						return;
					if(!srcFile.isDirectory())
						return;
					if(!destFile.exists())
						destFile.mkdirs();
					
					File[]files = srcFile.listFiles();
					for(File eachFile:files){
						if(eachFile.isFile()){
							File destCopyFile = new File(destFile,eachFile.getName());
							copyFile(eachFile.getAbsolutePath(),destCopyFile.getAbsolutePath());
									while(true){
										copyFileTollay+=eachFile.length();
										double rate = (double)copyFileTollay/(double)srcFileTollay;
										int intRate = (int)(rate*100);
										pb.setValue(intRate);
										pb.setStringPainted(true);
										if(intRate>=100)
											JOptionPane.showMessageDialog(f,"复制完成");
										    b.setEnabled(true);
										    break;
									}
						}
						if(eachFile.isDirectory()){
							File destCopyFile = new File(destFile,eachFile.getName());
							copyFolder(eachFile.getAbsolutePath(),destCopyFile.getAbsolutePath());
						}
					}
				}

				public  void copyFile(String srcFilePath,String destFilePath){
				     File srcFile = new File(srcFilePath);
				     File destFile = new File(destFilePath);
				     
				     byte []buffer = new byte[1024];
				     
				     try(
				    	     FileInputStream fis = new FileInputStream(srcFile);	 
				    		 FileOutputStream fos = new FileOutputStream(destFile);	 
				        ){
				    	while(true){
				    		int actullyLength = fis.read(buffer);
				    		if(actullyLength==-1)
				    			break;
				    		fos.write(buffer,0,actullyLength);
				    		fos.flush();
				    	}
				     }catch(FileNotFoundException e){
				    	 e.printStackTrace();
				     }catch(IOException e){
				    	 e.printStackTrace();
				     }
				}
			
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				String checkS = checkSrcPath(tfSrcPath,"源文件地址");
				if(checkS==null)
					return;
				String checkD = checkdestPath(tfdestPath,"源文件地址");
				if(checkD==null)
					return;
				
				srcFileTollay = getLength(tfSrcPath.getText(),tfdestPath.getText());
				Thread t = new Thread(){
					public void run(){
						copyFolder(tfSrcPath.getText(),tfdestPath.getText());
					}
				};
				t.start();
				b.setEnabled(false);
				
			}
			
			public String checkSrcPath(JTextField tf,String msg){
				if(tf.getText().length()==0){
					JOptionPane.showMessageDialog(f,msg+"不能为空");
					tf.grabFocus();
					return null;
				}
				File checkFile = new File(tf.getText());
				if(!checkFile.exists()){
					JOptionPane.showMessageDialog(f, msg+"不存在");
					tf.grabFocus();
					return null;
				}
				return "";
			}
			
			public String checkdestPath(JTextField tf,String msg){
				if(tf.getText().length()==0){
					JOptionPane.showMessageDialog(f,"目标地址不能为空");
					tf.grabFocus();
					return null;
				}
				File checkFile = new File(tf.getText());
				if(!checkFile.exists())
					checkFile.mkdirs();
				return "";
			}
		});
	}
}

							


2 个答案

疾風亦有歸途
答案时间:2021-08-10
進度條

文玉
答案时间:2021-04-10
processbar要多线程才能实现实时更新哦



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





2020-09-07 我就想问问,有年息20%的理财产品吗?
2020-08-12 f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 用不了
2020-05-21 练习-数字校验.


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

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

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

上传截图