Swing 和 Quartz 小整合

本文详细介绍了如何将Quartz框架应用于Swing GUI中,实现定时任务,并解决在任务调度过程中遇到的初始化问题。通过实例演示了如何在GUI界面上展示定时任务的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近想做一个上传小 软件,,并想执行任务时依然显示在JTextArea 中

很自然想到了Quartz 这个框架,用起来也方便。就在整合是发现了这样一个问题

SwingTest.java

package com.yongan.test;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Date;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextArea;

import org.quartz.CronTrigger;
import org.quartz.Job;
import org.quartz.JobDetail;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;

public class SwingTest extends JFrame {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	/**
	 * @param args
	 */
	JFrame frame;
	JTextArea textarea;
	JButton button;
	
	public SwingTest(){
		frame = new JFrame();
		textarea = new JTextArea();
		button = new JButton("显示");
		button.addActionListener(new MyActionListener());
		frame.add(textarea,BorderLayout.CENTER);
		frame.add(button,BorderLayout.NORTH);
		frame.setBounds(400, 100, 600, 400);
		frame.addWindowListener(new WindowAdapter(){
			@Override
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
		frame.setVisible(true);
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		SwingTest swing = new SwingTest();

	}
	
	class MyActionListener implements ActionListener{

		@Override
		public void actionPerformed(ActionEvent e) {
			// TODO Auto-generated method stub'
			try{
			SchedulerFactory scheduler = new StdSchedulerFactory();
			Scheduler schedu =scheduler.getScheduler();
			
			//JobDetail job = new JobDetail("job1","group1",SimpleJob.class);// 一直以来这里我都是用类似 SimpleJob.class,可是这里应该如何传参呢?
                        JobDetail job = new JobDetail("job1","group1",(new SimpleJob(textarea)).getClass());
                        CronTrigger con = new CronTrigger("trigger","group1","job1","group1","0/3 * * * *  ?");
			
			schedu.addJob(job, true);
			schedu.scheduleJob(con);
			
			schedu.start();
			}catch(Exception ex){
				ex.printStackTrace();
			}
			
		}
		
	}
	


}

当然想到JobDetail 中马上想到带参的构造方法SimpleJob(JTextArea textarea) 或用内部类也行


那我就用带参的构造方法吧

package com.yongan.test;

import javax.swing.JTextArea;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class SimpleJob implements Job {
        public  JTextArea textarea;
	
	public SimpleJob(JTextArea textarea){
		this.textarea = textarea;
	}

	@Override
	public void execute(JobExecutionContext arg0) throws JobExecutionException {
		// TODO Auto-generated method stub
		textarea.append("show \n");
	
	}

}


就在准备用这方法大功功成时,问题来了

当我点击显示按钮时,textarea中没有隔3秒显示一个show,那就发挥我码农的精神坝


首先打印的肯定是textarea  结果为null  不解,没有初始化 ?

于时在构造方法处打印 textarea 结果 不为null ,于是我猜想是不是初始化还调用了默认的构造方法

那就加上吧

package com.yongan.test;

import javax.swing.JTextArea;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class SimpleJob implements Job {
	public  JTextArea textarea;
	
	
	public SimpleJob(){
		System.out.println(this.textarea);
	}
	public SimpleJob(JTextArea textarea){
		this.textarea = textarea;
		System.out.println(this.textarea);
	}

	@Override
	public void execute(JobExecutionContext arg0) throws JobExecutionException {
		// TODO Auto-generated method stub
		textarea.append("show \n");
	
	}

}

 这里就出现一个奇怪的现像了 第一次打印不为 null 后面就隔3秒打印一个 null

难道是Quartz 在初始化调用第一次有参构造方法,后面都调用无参的运行,抱着先解决问题的态度,既然第一次能初始化成功,那就加上static 让他变成全局的吧!

package com.yongan.test;

import javax.swing.JTextArea;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class SimpleJob implements Job {
	public  static JTextArea textarea;
	
	
	public SimpleJob(){
		System.out.println(this.textarea);
	}
	public SimpleJob(JTextArea textarea){
		this.textarea = textarea;
		System.out.println(this.textarea);
	}

	@Override
	public void execute(JobExecutionContext arg0) throws JobExecutionException {
		// TODO Auto-generated method stub
		textarea.append("show \n");
	
	}

}


这样我想要的问题解决 了

完整的代码如下

SwingTest.java

package com.yongan.test;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Date;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextArea;

import org.quartz.CronTrigger;
import org.quartz.Job;
import org.quartz.JobDetail;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;

public class SwingTest extends JFrame {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	/**
	 * @param args
	 */
	JFrame frame;
	JTextArea textarea;
	JButton button;
	
	public SwingTest(){
		frame = new JFrame();
		textarea = new JTextArea();
		button = new JButton("显示");
		button.addActionListener(new MyActionListener());
		frame.add(textarea,BorderLayout.CENTER);
		frame.add(button,BorderLayout.NORTH);
		frame.setBounds(400, 100, 600, 400);
		frame.addWindowListener(new WindowAdapter(){
			@Override
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
		frame.setVisible(true);
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		SwingTest swing = new SwingTest();

	}
	
	class MyActionListener implements ActionListener{

		@Override
		public void actionPerformed(ActionEvent e) {
			// TODO Auto-generated method stub'
			try{
			SchedulerFactory scheduler = new StdSchedulerFactory();
			Scheduler schedu =scheduler.getScheduler();
			
			JobDetail job = new JobDetail("job1","group1",(new SimpleJob(textarea)).getClass());
			CronTrigger con = new CronTrigger("trigger","group1","job1","group1","0/3 * * * *  ?");
			
			schedu.addJob(job, true);
			schedu.scheduleJob(con);
			
			schedu.start();
			}catch(Exception ex){
				ex.printStackTrace();
			}
			
		}
		
	}
	


}

SimpleJob.java

package com.yongan.test;

import javax.swing.JTextArea;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class SimpleJob implements Job {
	public  static JTextArea textarea;
	
	
	public SimpleJob(){
		
	}
	public SimpleJob(JTextArea textarea){
		this.textarea = textarea;
		
	}

	@Override
	public void execute(JobExecutionContext arg0) throws JobExecutionException {
		// TODO Auto-generated method stub
		textarea.append("show \n");
	
	}

}
可是问题是解决了,Quartz 调用无参的构造方法做任务调度,依然不解!求大神看过源码的,帮忙解析下!谢谢!



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值