最近在写定时拉取中国天气数据的程序,使用的是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=======*/
	}
}


以下是界面效果图

TimerTask定时任务暂停与开启以及修改间隔时间


抓取天气数据的程序由于代码比较多就补贴出来了。感兴趣的可以留言问我要git路径。






作者:星辰 时间:2016-12-11 浏览 1061评论 0 赞 0砸 0 标签: Java基础知识 爬虫 demo swing
评论
还可以再输入500个字

请您注意

·自觉遵守:爱国、守法、自律、真实、文明的原则
·尊重网上道德,遵守《全国人大常委会关于维护互联网安全的决定》及中华人民共和国其他各项有关法律法规
·严禁发表危害国家安全,破坏民族团结、国家宗教政策和社会稳定,含侮辱、诽谤、教唆、淫秽等内容的作品
·承担一切因您的行为而直接或间接导致的民事或刑事法律责任
·您在NoteShare上发表的作品,NoteShare有权在网站内保留、转载、引用或者删除
·参与本评论即表明您已经阅读并接受上述条款