Java 如何在actionlistener中按顺序执行任务
我想在actionlistener中按特定顺序执行任务。在我的代码中,当按钮上的主要任务执行时,我希望在操作中显示加载图标。但是,当我按下d按钮时,所有操作都同时完成。。我希望JLabel img在执行数据库连接任务之前显示我的图像。这是我的代码Java 如何在actionlistener中按顺序执行任务,java,swing,actionlistener,Java,Swing,Actionlistener,我想在actionlistener中按特定顺序执行任务。在我的代码中,当按钮上的主要任务执行时,我希望在操作中显示加载图标。但是,当我按下d按钮时,所有操作都同时完成。。我希望JLabel img在执行数据库连接任务之前显示我的图像。这是我的代码 take.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent ev){ img.set
take.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent ev){
img.setIcon(image);
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, 1);
SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd");
String formatted = format1.format(cal.getTime());
String dname = (String)doclist.getSelectedItem();
try{
db.connect();
rs=db.stmt.executeQuery("Select * from table4 where name='"+dname+"'");
rs.next();
final String id=rs.getString("dr_id");
String mst=rs.getString("mor_start");
String est=rs.getString("eve_start");
int mmax=rs.getInt("mor_max");
int emax=rs.getInt("eve_max");
int mava=rs.getInt("mor_ava");
int eava=rs.getInt("eve_ava");
}});
使用
SwingWorker
。有关更多信息,请阅读Swing教程中的部分。您可以使用@camickr所说的SwingWorker
。这里有一个完整的。其思想是在另一个后台线程中运行某些进程,而不是在与GUI不同的线程中。图形用户界面的东西在数据库中运行
这里有一个例子:
class Worker extends SwingWorker<Void, String> {
private JLabel labelToUpdate;
private final String dname;
public Worker(JLabel label, String dname){
super();
this.labelToUpdate=label;
this.dname=dname;
}
@Override
protected void doInBackground() throws Exception {
//here you make heavy task this is running in another thread not in EDT
// you connect to the db and make the query you can call
// publish("connectin to the db") and this will call process
// Connection con = ...
}
@Override
protected void process(List<String> chunks) {
StringBuilder sb = new StringBuilder();
for(String chunk : chunks){
sb.append(chunk).append("\n");
}
labelToUpdate.setText(sb.toString());
}
//Executed on the Event Dispatch Thread after the doInBackground method is finished
@Override
protected void done(){
labelToUpdate.setIcon(null);
}
}
你能用我的示例plss更具体一点吗。。这将是非常有帮助的,以及如何传递参数,如dname和许多其他在中执行查询所需的参数db@user2984132您可以创建一个包装类,将其作为属性,或者将其作为swingWorker的属性,并通过构造函数或setter传递它,就像我对标签所做的那样;),如果你不理解我的观点,请告诉我,请用我的例子解释。。我很困惑。。告诉我在这两个阶段该做什么sides@user2984132,这就是我为什么不填鸭式回答的原因。OP没有学到任何东西,他们一直在问问题。教程和论坛中都有大量使用SwingWorker的示例。不要期望别人为你写代码。发布显示您尝试执行的操作的代码。那么也许我们可以帮助解决这个问题。这称为
SSCCE
。
take.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent ev){
String dname = (String)doclist.getSelectedItem();
SwingWorker worker = new Worker(label,dname);
label.setIcon(image);
worker.execute();
}
);