我有这样的事情:
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();
}
}
因此,当用户按下按钮时,我试图生成一对长度为4096的RSA密钥,但在此之前我想要附加到我的TextArea:
" [RSA]生成一对密钥,这可能需要几分钟......"
当我运行程序并单击该按钮时,TextArea上没有任何内容,而是程序开始生成一对键,然后在TextArea上打印文本。我的代码有问题吗?我首先调用了toConsole(),然后调用了GenerateKeys()...
答案 0 :(得分:2)
您必须了解Swing管理它用于重绘GUI元素的同一个线程中的每个事件。
解决这两件事的一种可能方法是将冗长的任务包含在SwingWorker中。这是一个可以放入Swing管理的线程池的任务,甚至可以更新GUI及其进度。
https://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html
另一种可能的方法是使用您的任务弹出一个新线程并使用invokeLater
http://www.javamex.com/tutorials/threads/invokelater.shtml
这将是最简单的。希望这很有用!