java - 使用 Swing Worker 在 Swing GUI 中运行 JUnit 测试

标签 java swing user-interface junit swingworker

我正在编写一个 GUI,它能够执行一些 JUnit 测试,并且为了处理这个问题,我使用了 SwingWorker。

当我启动程序时,GUI 出现,我单击一些选择,SwingWorker 启动并完成它的一部分,最后输出控制台输出或文件输出。然后我会再次单击 GUI 并开始另一个测试。此时,当程序完成时,它将生成两次最终输出,例如控制台输出后面将直接跟随相同的控制台输出。

我假设这是由于 SwingWorker 没有终止并“死亡”。

此外,当我单击 GUI 中的“开始”按钮时,我正在创建 SwingWorker。这是一个坏主意吗?正确的方法是什么?

编辑添加了代码示例

public class TestMainFrame {

private static JFrame frame;
private static JTextArea textArea;

public TestMainFrame(){
    createAndShowGUI();
}

private void createAndShowGUI() {
    frame = new JFrame("Test");
    frame.setLayout(new BorderLayout());

    JButton btn = new JButton("Test Me");
    btn.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            if(btn.getText().equals("Test Me")){
                testMe();
            }
        }
    });

    textArea = new JTextArea("This is a test pane! \n");
    textArea.setEditable(false);
    JScrollPane scroller = new JScrollPane(textArea);

    frame.add(scroller, BorderLayout.CENTER);
    frame.add(btn, BorderLayout.PAGE_END);

    frame.setSize(new Dimension(300, 400));
    frame.setVisible(true);
    frame.setLocationRelativeTo(null);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

private static void testMe(){
    writeToTextArea("Button Pressed");
    writeToTextArea("Starting tests");

    SwingWorker<Result, Void> worker = new SwingWorker<Result, Void>() {
        @Override
        public Result doInBackground() {     
            writeToTextArea("Inside the doInBackground method of SwingWorker");

            return null;
        }
        @Override
        public void done() {
            writeToTextArea("The SwingWorker has finished");

        }
    };

    worker.execute();
}

private static void writeToTextArea(String text){
    textArea.append(text + "\n");
}

最佳答案

(不是答案)
这就是我运行你的代码的方式:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class TestMainFrame {

   private static JFrame frame;
   private static JTextArea textArea;

   public TestMainFrame() {
      createAndShowGUI();
   }

   private void createAndShowGUI() {
      frame = new JFrame("Test");
      frame.setLayout(new BorderLayout());

      final JButton btn = new JButton("Test Me");
      btn.addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
            if (btn.getText().equals("Test Me")) {
               testMe();
            }
         }
      });

      textArea = new JTextArea("This is a test pane! \n");
      textArea.setEditable(false);
      JScrollPane scroller = new JScrollPane(textArea);

      frame.add(scroller, BorderLayout.CENTER);
      frame.add(btn, BorderLayout.PAGE_END);

      frame.setSize(new Dimension(300, 400));
      frame.setVisible(true);
      frame.setLocationRelativeTo(null);
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   }

   private static void testMe() {
      writeToTextArea("Button Pressed");
      writeToTextArea("Starting tests");

      SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() {
         @Override
         public Void doInBackground() {
            writeToTextArea("Inside the doInBackground method of SwingWorker");

            return null;
         }

         @Override
         public void done() {
            writeToTextArea("The SwingWorker has finished");
         }
      };

      worker.execute();
   }

   // *** note change *** 
   private static void writeToTextArea(final String text) {
      if (SwingUtilities.isEventDispatchThread()) {
         textArea.append(text + "\n");
      } else {
         SwingUtilities.invokeLater(new Runnable() {
            public void run() {
               textArea.append(text + "\n");
            }
         });
      }

   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            TestMainFrame testMainFrame = new TestMainFrame();
            testMainFrame.createAndShowGUI();
         }
      });
   }
}

关于java - 使用 Swing Worker 在 Swing GUI 中运行 JUnit 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33169510/

相关文章:

java - 将 Spring MVC 与 html 结合使用

java - 程序运行时什么都不显示

Java Swing - JSpinner 中的问题

java - 加载外部源代码并在内部使用它们(通过重新编译或其他方式)

java - 将字符串发送到服务器,不带反斜杠

java - 如何使用 JGIT 恢复到修订版

java - 数组中的 GUI 按钮

java - 如何添加ActionListener来自定义组件

user-interface - 从 Hadoop Web UI 将文件添加到 HDFS

.net - Winforms 样式/UI 外观和感觉提示