最近想做一个上传小 软件,,并想执行任务时依然显示在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 调用无参的构造方法做任务调度,依然不解!求大神看过源码的,帮忙解析下!谢谢!