控制Java

时间:2015-06-05 18:27:36

标签: java swing

我有这样的事情:

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()...

1 个答案:

答案 0 :(得分:2)

您必须了解Swing管理它用于重绘GUI元素的同一个线程中的每个事件。

解决这两件事的一种可能方法是将冗长的任务包含在SwingWorker中。这是一个可以放入Swing管理的线程池的任务,甚至可以更新GUI及其进度。

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

另一种可能的方法是使用您的任务弹出一个新线程并使用invokeLater

从那里对GUI进行更新

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

这将是最简单的。希望这很有用!