утилизация фрейма от swingWorker

на самом деле я вызвал качающийся рабочий из фрейма (предположим) A .. в классе качающегося рабочего в методе do-in-Background у меня есть определенные запросы к БД, и я тоже вызываю фрейм B .. в методе done (), однако я хочу избавиться от кадра А.. как я могу это сделать..? я не могу написать dispose() в классе кадра A, потому что это приводит к удалению кадра до того, как новый кадр (кадр 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
}

person user2984132    schedule 14.11.2013    source источник
comment
Ситуация выглядит подозрительно похожей на использование одного фрейма и CardLayout было бы уместнее. Также обратите внимание, что вы нарушаете правила потоковой передачи Swing, изменяя компоненты Swing за пределами EDT как в main(), так и в doInBackground().   -  person kiheru    schedule 14.11.2013
comment
невозможно ли разместить фреймА.. потому что это требуется в моем приложении.. я не могу использовать окно с вкладками   -  person user2984132    schedule 14.11.2013


Ответы (1)


  1. Метод done() метода SwingWorker обычно переопределяется для отображения окончательного результата. По завершении doInBackground() SwingWorker автоматически вызывает done() в EDT. Так что поместите невидимый и видимый код вашего фрейма в эту функцию.

  2. doInBackground() не предназначен для выполнения каких-либо задач рендеринга графического интерфейса. Вы можете вызвать функцию publish(V) из doInBackground(), которая, в свою очередь, вызывает метод process(V) для запуска внутри EDT и выполнения задачи рендеринга графического интерфейса.

Таким образом, пример решения будет таким:

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 окон. Подробнее см. в разделе Использование нескольких JFrames. , Хорошая/плохая практика?. Общий обходной путь с вариантом использования, когда потребуется несколько кадров, - это объяснено здесь.

person Sage    schedule 14.11.2013