2014-02-23 1 views
-1

Попытка прекратить поворот gui, начать тот же gui и прекратить его.Как я могу программно завершить графический интерфейс swing?

Я использую ответ на этот вопрос question, но он работает только один раз.

ниже код циклов один раз и зависаний после печати 2.

import java.awt.Toolkit; 
import java.awt.event.WindowEvent; 
import java.lang.reflect.InvocationTargetException; 
import javax.swing.*; 
public class Hello { 
    void createAndShowGUI() { 
     frame=new JFrame("HelloWorldSwing"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JLabel label=new JLabel("Hello World"); 
     frame.getContentPane().add(label); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
    void goodbye() { 
     WindowEvent wev=new WindowEvent(frame,WindowEvent.WINDOW_CLOSING); 
     Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(wev); 
    } 
    static void helloGoodbye() throws InterruptedException,InvocationTargetException { 
     System.out.println("enter"); 
     final Hello hello=new Hello(); 
     System.out.println("1"); 
     javax.swing.SwingUtilities.invokeAndWait(new Runnable() { 
      public void run() { 
       System.out.println("3"); 
       hello.createAndShowGUI(); 
       System.out.println("4"); 
      } 
      { 
       System.out.println("2"); 
      } 
     }); 
     System.out.println("5"); 
     SwingUtilities.invokeAndWait(new Runnable() { 
      public void run() { 
       hello.goodbye(); 
       System.out.println("6"); 
      } 
     }); 
     // Thread.sleep(1000); 
     System.out.println("exit"); 
    } 
    public static void main(String[] args) throws InvocationTargetException,InterruptedException { 
     for(int i=0;i<10;i++) 
      helloGoodbye(); 
     System.out.println("exiting main"); 
    } 
    JFrame frame; 
} 

Почему это не работает?

+3

Chit, ваш код даже не компилируется. Но также важно, какова ваша цель. На ваш вопрос звучит так, как будто вы хотите начать, остановиться, а затем запустить и остановить графический интерфейс Swing? Зачем? Какой опыт пользовательского интерфейса вы водите? –

+0

он компилируется для меня в затмении. Я использовал jdk 8. Я добавлю финал. каждый вызов сохранит изображение gui в файле. –

+0

Вы не указали модификатор доступа «final» в своем объявлении переменной Hello, поэтому нет, он не должен компилироваться. –

ответ

4

Программа не зависает, а он выходит из-за:

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

От the doc:

EXIT_ON_CLOSE (определено в JFrame): Закройте приложение, использующее метод выхода из системы. Используйте это только в приложениях.

Здесь, похоже, DISPOSE_ON_CLOSE приведет к поведению, которое вы ожидаете. Я также не вижу причины, чтобы опубликовать это событие закрытия окна, когда вы можете позвонить setVisible(false) и dispose. Без предположений о том, что на самом деле предназначена программа, обе эти опции приведут к отображению/скрытию/удалению всех 10 кадров.

Я бы предположил, что причина, по которой программа останавливается после печати «2», заключается в том, что вызов invokeAndWait вызывает пересылку ранее запущенных событий, включая событие закрытия окна.

+0

, который работает как шарм. я понятия не имел, что он звонил system.exit! Благодарю. –