Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 处理来自swingWorker的框架_Java_Swing_Jframe_Swingworker - Fatal编程技术网

Java 处理来自swingWorker的框架

Java 处理来自swingWorker的框架,java,swing,jframe,swingworker,Java,Swing,Jframe,Swingworker,实际上,我已经从一个框架(假设)a.中调用了swing worker。。在后台方法do中的swing worker类中,我有一些db查询,我也在调用frame B。。但是,在done()方法中,我要处理帧A。。我该怎么做。。?我无法在frame A类中编写dispose(),因为这会导致在新帧(frame B)可见之前处理frame。。。请帮忙 class frameA extends JFrame{ public frameA(){ //done some operations.. Swing

实际上,我已经从一个框架(假设)a.中调用了swing worker。。在后台方法do中的swing worker类中,我有一些db查询,我也在调用frame B。。但是,在done()方法中,我要处理帧A。。我该怎么做。。?我无法在frame A类中编写dispose(),因为这会导致在新帧(frame B)可见之前处理frame。。。请帮忙

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

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

}
工人阶级

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
}
类工作者扩展SwingWorker{
公职人员(){
超级();
}
//在doInBackground方法完成后在事件分派线程上执行
@凌驾
受保护的void done(){
//要在此处处置框架A。。
}
@凌驾
受保护的Void doInBackground()引发异常{
//一些数据库查询
新frameB().setVisible(true);
//调用frameb
}
  • SwingWorker
    done()
    方法通常会被覆盖以显示最终结果 完成
    doInBackground()
    ,SwingWorker将自动调用
    done()
    在EDT中。因此,将帧的不可见和可见代码放入此函数中

  • class frameA extends JFrame{
    public frameA(){
    //done some operations..
    SwingWorker worker=new Worker();
           worker.execute();
    
    }
    public static void main(string[] args){
      new frameA();
    }
    
    }
    
  • doInBackground()
    不用于执行任何GUI渲染任务。您可以从
    doInBackground()
    函数调用
    publish(V)
    ,该函数反过来调用
    process(V)
    方法在EDT内运行并执行GUI渲染任务

  • class frameA extends JFrame{
    public frameA(){
    //done some operations..
    SwingWorker worker=new Worker();
           worker.execute();
    
    }
    public static void main(string[] args){
      new frameA();
    }
    
    }
    
    因此,样本溶液应为:

    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> {
    
      JFrame frameA;
    
      public Worker(JFrame frameA) {
        this.frameA = frameA;
    
      }
    
      @Override
      protected void done() {
        frameA.dispose();
        new frameB().setVisible(true); 
    
      }
      //other code
    }
    
    类工作者扩展SwingWorker{
    jframea;
    公共工作者(JA){
    this.frameA=frameA;
    }
    @凌驾
    受保护的void done(){
    frameA.dispose();
    新frameB().setVisible(true);
    }
    //其他代码
    }
    
    现在,通过将目标帧传递给其构造函数来创建
    SwingWorker
    实例:
    newworker(frame)
    ;对于您的上下文,您可能可以使用

    class frameA extends JFrame{
    public frameA(){
    //done some operations..
    SwingWorker worker=new Worker();
           worker.execute();
    
    }
    public static void main(string[] args){
      new frameA();
    }
    
    }
    

    但是,您不应该将应用程序设计为依赖于多个
    JFrame
    。不使用多个
    JFrame
    窗口是有原因的。有关更多信息,请参阅。在需要多个框架的用例中,一个通用的解决方法是

    这种情况看起来很可疑,就像使用单个框架和would更合适。还请注意,您通过在
    main()
    doInBackground()
    中修改EDT之外的swing组件,违反了swing线程规则。是否无法处理框架a..z因为我的应用程序中需要它..我无法使用选项卡式窗口
    class frameA extends JFrame{
    public frameA(){
    //done some operations..
    SwingWorker worker=new Worker();
           worker.execute();
    
    }
    public static void main(string[] args){
      new frameA();
    }
    
    }