最近在写定时拉取中国天气数据的程序,使用的是swing写的,为了提高维护性,对窗口做了一个开始与暂停按钮,并做了一个设置定时任务间隔时间的功能。使用的是Timer定时器,
使用过Timer的小伙伴应该知道它似乎没有提供开启和暂停的方法,也没有提供修改间隔时间的方法,为此我做了些小小的改动让其实现了自己的需求。
大致思路:通过标志变量来控制开启与暂停,通过反射来修改TimerTask的友员(default)变量period(TimerTask没有为其提供set方法)的值,从而达到修改定时器间隔时间的需求。
以下是个人的实现代码,不排除大家会有更好的方式。
package com.noteshare.main; import java.lang.reflect.Field; import java.util.TimerTask; /** * @ClassName : Task * @Description : 拉取天气数据的任务;此类添加了修改任务间隔执行时间的方法setPeriod,并添加了控制任务暂停与开启的变量flag。 * @author : NoteShare * @date : 2016年12月11日 下午10:12:29 */ public class Task extends TimerTask{ //标志任务是否开始执行,默认不执行 private boolean flag = false; public void setPeriod(long period) { //缩短周期,执行频率就提高 setDeclaredField(TimerTask.class, this, "period", period); } //通过反射修改字段的值 static boolean setDeclaredField(Class<?> clazz, Object obj,String name, Object value) { try { Field field = clazz.getDeclaredField(name); field.setAccessible(true); field.set(obj, value); return true; } catch (Exception ex) { ex.printStackTrace(); return false; } } @Override public void run() { if(flag){ System.out.println("任务开始执行!!!"); /*try { Map<String, String> paramMap = new HashMap<String, String>(); RequestParams resParam = new RequestParams("http://www.weather.com.cn/weather1d/101190202.shtml", 0, paramMap); Document doc = SpiderUtil.getDocument(resParam, null); RealTimeService realTimeService = new RealTimeServiceImpl(); JSONObject json = realTimeService.getLiveIndex(doc); File file = new File("D:\\test.txt"); FileOutputStream fos = new FileOutputStream(file,true); PrintWriter pw = new PrintWriter(fos); pw.write(json.toString()); pw.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }*/ }else{ System.out.println("任务已被暂停执行!!!"); } } public boolean isFlag() { return flag; } public void setFlag(boolean flag) { this.flag = flag; } }
以下是个人做的一个swing界面,有点丑,各位不要介意,好多年都不写这东西了,今天也是边百度边回忆的写代码。
package com.noteshare.main; import java.awt.BorderLayout; import java.awt.FlowLayout; import java.awt.Label; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.util.Calendar; import java.util.Date; import java.util.Timer; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JPanel; /** * @ClassName : Main * @Description : 程序入口类 * @author : NoteShare * @date : 2016年12月11日 下午10:15:10 */ public class Main { public static void main(String[] args) throws Exception { /**====================================窗口的绘制=============================start==*/ // 创建jframe JFrame frame = new JFrame("FrameDemo"); frame.setResizable(false); frame.setTitle("抓取中国天气数据"); frame.setBounds(400, 400, 400, 150); frame.setVisible(true); // 创建jpanel JPanel mainJpanel = new JPanel(); // 采用绝对布局 mainJpanel.setLayout(new BorderLayout()); frame.setContentPane(mainJpanel); //==========================窗口头部表单区=================start /*JPanel centerJpanel = new JPanel(new GridLayout(1, 2)); centerJpanel.setBorder(BorderFactory.createTitledBorder("说明:")); Label periodLabel = new Label("interval time(seconds):"); periodLabel.setSize(120, 45); final TextField periodText = new TextField(); centerJpanel.add(periodLabel); centerJpanel.add(periodText); mainJpanel.add(centerJpanel, BorderLayout.PAGE_START);*/ //==========================窗口中部说明区=================start JPanel northJPanel = new JPanel(); Label desLabel = new Label("You can click on the set button below to set the task time interval,"); Label desLabel2 = new Label(" the interval of the default time of 1 minute. "); northJPanel.add(desLabel); northJPanel.add(desLabel2); mainJpanel.add(northJPanel, BorderLayout.CENTER); //==========================窗口中部说明区=================end //==========================窗口底部按钮区==================start //创建按钮面板 JPanel soutchJpanel = new JPanel(); soutchJpanel.setLayout(new FlowLayout()); // 创建开始按钮 final JButton startButton = new JButton("开始"); startButton.setSize(60, 30); startButton.setVisible(true); soutchJpanel.add(startButton); //创建结束按钮 final JButton endButton = new JButton("停止"); endButton.setSize(60,30); soutchJpanel.add(endButton); endButton.setVisible(false); //创建间隔时间设置按钮 final JButton setButton = new JButton("设置"); setButton.setSize(60, 30); soutchJpanel.add(setButton); mainJpanel.add(soutchJpanel,BorderLayout.PAGE_END); /**====================================窗口的绘制=============================end==*/ /**====================================业务处理=============================start==*/ //定义定时器 final Timer timer = new Timer(); Calendar calendar = Calendar.getInstance(); Date time = calendar.getTime(); // 得出执行任务的时间,此处为今天的12:00:00 //定义任务 final Task task = new Task(); timer.schedule(task, time, 6000); /**====================================业务处理=============================end==*/ /**===========================================事件定义==========================start=======*/ /** * 单击执行按钮开始获取数据 */ startButton.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { startButton.setVisible(false); endButton.setVisible(true); task.setFlag(true); } }); /** * 结束按钮监听鼠标点击事件 */ endButton.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { startButton.setVisible(true); endButton.setVisible(false); task.setFlag(false); } }); /** * 设置按钮鼠标单击事件 */ setButton.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { Object[] obj2 ={ "1分钟", "2分钟", "5分钟","10分钟","20分钟"}; String value = (String) JOptionPane.showInputDialog(null,"请选择任务间隔时间单位为分钟:\n", "间隔时间", JOptionPane.PLAIN_MESSAGE, new ImageIcon("icon.png"), obj2, "1分钟"); if(null != value){ value = value.replace("分钟", ""); long period = Integer.valueOf(value) * 60 * 1000; task.setPeriod(period); } } }); /** * 窗口关闭事件监听 */ frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e){ //销毁定时器 System.exit(0); } }); /**===========================================事件定义==========================end=======*/ } }
以下是界面效果图
抓取天气数据的程序由于代码比较多就补贴出来了。感兴趣的可以留言问我要git路径。
请您注意
·自觉遵守:爱国、守法、自律、真实、文明的原则
·尊重网上道德,遵守《全国人大常委会关于维护互联网安全的决定》及中华人民共和国其他各项有关法律法规
·严禁发表危害国家安全,破坏民族团结、国家宗教政策和社会稳定,含侮辱、诽谤、教唆、淫秽等内容的作品
·承担一切因您的行为而直接或间接导致的民事或刑事法律责任
·您在NoteShare上发表的作品,NoteShare有权在网站内保留、转载、引用或者删除
·参与本评论即表明您已经阅读并接受上述条款