2015-06-05 2 views
0

У меня есть что-то вроде этого:Контроллинг порядок функций в Java

final JButton btnGenerate = new JButton("Generate Keys"); 
     btnGenerate.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent arg0) { 
       //On click, Generate Keys 
       toConsole("[RSA] Generating a pair of keys, this can take several minutes..."); 
       GenerateKeys(); 
       toConsole("[RSA] Done"); 
       btnGenerate.setEnabled(false); 
       btnConnect.setEnabled(true); 
      } 
     }); 

toConsole:

public void toConsole (String s) { 
     chatArea.append(s + "\n"); 
    } 

GenerateKey:

public void GenerateKeys(){ 
     try {        
      KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); 
      keyGen.initialize(4096); 
      KeyPair keyPair = keyGen.genKeyPair();   
      publicKey = keyPair.getPublic().getEncoded(); 
      privateKey = keyPair.getPrivate().getEncoded();    
     } catch (NoSuchAlgorithmException e) { 
      e.printStackTrace(); 
     }  
    } 

Таким образом, когда пользователь нажимает кнопку, я Я пытаюсь создать пару ключей RSA длиной 4096, но перед этим я хочу добавить в свой TextArea это:

«[RSA] Создание пары ключей, это может занять несколько минут ...»

Когда я запустить программу и нажать на эту кнопку, ничего появиться на TextArea, вместо запуска программы для генерации пара ключей, а затем распечатает текст в TextArea. Что-то не так в моем коде? Сначала я вызвал toConsole(), а затем GenerateKeys() ...

+1

Вероятно, вы все это делаете на EDT, что заморозит ваш графический интерфейс, пока EDT не сможет снова обрабатывать события. Используйте [фоновая задача.] (Https://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html) – markspace

+0

Хорошо, я попробую. Просто для любопытства, зачем мне это нужно, даже если команда append находится перед функцией GenerateKey? –

+0

Посмотрите мои комментарии: «заморозит ваш графический интерфейс» – markspace

ответ

2

Вы должны понимать, что Swing управляет каждым событием в том же потоке, который он использует, чтобы перерисовать элементы GUI.

Возможный способ разделить обе стороны заключить ваши длительные задачи в SwingWorker. Это задача, которую вы можете бросить в управляемый Swing поток, который даже может обновить GUI вместе с его прогрессом.

https://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html

Другим возможным способом было бы просто поп новую тему с вашей задачей и сделать обновления для вашего GUI оттуда с помощью invokeLater

http://www.javamex.com/tutorials/threads/invokelater.shtml

Это было бы самым простым. Надеюсь, это полезно!

Смежные вопросы