【问题标题】:disposing frame from swingWorker从 swingWorker 处理框架
【发布时间】:2013-11-27 09:23:21
【问题描述】:

实际上我已经从框架(假设)A.. 在 do-in-Background 方法中的 swing 工作人员类中调用了 swing worker,我有某些数据库查询,我也在调用框架 B.. 在 done()方法但是我想处理框架 A.. 我该怎么做..?我不能在框架 A 类中编写 dispose(),因为这会导致在新框架(框架 B)可见之前处理框架......请帮助!

class frameA extends JFrame{
public frameA(){
//done some operations..
SwingWorker worker=new Worker();
       worker.execute();

}
public static void main(string[] args){
  new frameA();
}

}

在工人阶级中

class Worker extends SwingWorker<Void, String> {



public Worker() {
    super();


}

//Executed on the Event Dispatch Thread after the doInBackground method is finished
@Override
protected void done() {
    //want to dispose the frameA here..


}

@Override
protected Void doInBackground() throws Exception {
    // some db queries
  new frameB().setVisible(true);  
  // call to frameb
}

【问题讨论】:

  • 这种情况看起来很可疑,使用单帧和CardLayout 会更合适。另请注意,您通过在 main()doInBackground() 中修改 EDT 之外的摆动组件来破坏摆动线程规则。
  • 是否无法处理 frameA.. 因为它在我的应用程序中是必需的.. 我无法使用选项卡式窗口

标签: java swing jframe swingworker


【解决方案1】:
  1. SwingWorkerdone() 方法通常被覆盖以显示最终结果。之上 doInBackground() 的完成,SwingWorker 自动调用 done() 在美国东部时间。所以把你框架的不可见和可见代码放在这个函数中。

  2. doInBackground() 并不意味着执行任何 GUI 渲染任务。您可以从doInBackground() 函数调用publish(V),该函数又调用process(V) 方法在EDT 内运行并执行GUI 渲染任务。

所以一个示例解决方案是:

class Worker extends SwingWorker<Void, String> {

  JFrame frameA;

  public Worker(JFrame frameA) {
    this.frameA = frameA;

  }

  @Override
  protected void done() {
    frameA.dispose();
    new frameB().setVisible(true); 

  }
  //other code
}

现在,通过将目标框架传递给它的构造函数来创建 SwingWorker 实例:new Worker(frame);对于您的上下文,您可能可以使用this

但是,您不应真正将应用程序设计为依赖于多个JFrame。有理由不使用多个JFrame 窗口。有关更多信息,请参阅The Use of Multiple JFrames, Good/Bad Practice?。需要多帧的用例的一般解决方法是explained here.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-02
    • 2014-02-28
    • 2015-05-28
    • 2021-11-15
    • 2011-04-13
    • 2012-10-27
    相关资源
    最近更新 更多