1

我有一个 Text Area swing 元素,我想在其中显示一些执行日志。消息应该出现在每个执行步骤之后。例如“提取已开始”。但问题是所有日志消息仅在按钮操作执行事件完成后出现一次。以下是我用来显示一些文本的方式

getXmlButton = new JButton("Fetch Reports");
    getXmlButton.addActionListener((new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {

            createDirectory();
            stutusArea.append("Fetching has been started");
            final String password = passwordTextField.getText();
            final String username = loginTextField.getText();

            OperatingSystemDriver os = new OperatingSystemDriver();
            driver = os.getDriver();

            stutusArea.append("getting some url");
            driver.get(URL);



           try {
               LoginPage login = new LoginPage(driver);
               login.loginAs(username, password);
               stutusArea.append("successful login"); 
           } catch (Exception e1) {
               stutusArea.append("login error"); 
            }
    insertToDbButton.setEnabled(true);
        }
    }));
4

2 回答 2

2

您必须使用不同的线程,否则您的 GUI 会阻塞。

请注意,从其他线程更新 GUI 是一个坏主意,请使用SwingUtilities.invokeLater来避免一些奇怪的错误/错误。

public void actionPerformed(ActionEvent e) {
    new Thread(new Runnable() {
        public void run() {
             SwingUtilities.invokeLater(new Runnable() {
                 public void run() {
                     stutusArea.append("Fetching has been started");
                 }
             })
             final String password = passwordTextField.getText();
             final String username = loginTextField.getText();
             // ...
        }
    }).start();
}
于 2013-03-09T12:57:31.183 回答
1

那是因为您ActionPerformed在 GUI 线程中执行所有操作,因此 GUI 冻结,并等待您的ActionPerformed操作完成,避免这种情况的一种方法是使用Threads,有一个示例:Thread Example

于 2013-03-09T12:52:16.787 回答