Java 清除Swing中按钮单击操作上的文本字段

Java 清除Swing中按钮单击操作上的文本字段,java,swing,user-interface,jtextfield,Java,Swing,User Interface,Jtextfield,我有许多按钮,单击这些按钮将运行一个脚本,如果成功,将使用Swing在GUI的文本字段中生成一条通过/失败的消息。我注意到,即使单击新按钮运行脚本,上一个结果的文本仍会显示。此文本将一直显示,直到脚本完成,并生成一个新结果,然后显示该结果 我想添加一些代码,这样当单击一个新按钮时,文本字段会被重置,并且在脚本完成之前不会显示任何文本 按钮: Test1 = new JButton("Test1"); Test1.setLocation(290, 30); Test1.se

我有许多按钮,单击这些按钮将运行一个脚本,如果成功,将使用Swing在GUI的文本字段中生成一条通过/失败的消息。我注意到,即使单击新按钮运行脚本,上一个结果的文本仍会显示。此文本将一直显示,直到脚本完成,并生成一个新结果,然后显示该结果

我想添加一些代码,这样当单击一个新按钮时,文本字段会被重置,并且在脚本完成之前不会显示任何文本

按钮:

    Test1 = new JButton("Test1");
    Test1.setLocation(290, 30);
    Test1.setSize(120, 30);
    Test1.addActionListener(this);
    Test1.addMouseListener(new MouseAdapter() {
        public void mouseClicked(java.awt.event.MouseEvent e) {
            if (Test1.isEnabled()) {
                errorLabel.setText("");
                result = JUnitCore.runClasses(Test1.class);
                errorMessageDisplay(result);
            }
        }
    });
    buttonPanel.add(Test1);
错误消息的代码:

public void errorMessageDisplay(Result resultPass) {
    errorLabel.addMouseListener(new MouseAdapter(){
        @Override
        public void mouseClicked(MouseEvent e){
            errorLabel.setText("");
            errorLabel.setVisible(true);
        }
    });


    if (result.getFailureCount() > 0) {
        errorLabel.setForeground(Color.red);
        errorLabel.setVisible(true);
        errorLabel.setText(" Failed");
    }

    else {
        errorLabel.setForeground(Color.green);
        errorLabel.setText(" Passed");
        errorLabel.setVisible(true);
    }
}

最简单的解决方案是创建另一个线程

if (Test1.isEnabled()) {
    errorLabel.setText("");
    new Thread(()->{
        Result result = JUnitCore.runClasses(Test1.class);
        EventQueue.invokeLater(()->errorMessageDisplay(result));
    }).start();
}
这不是一个很好的解决方案,请考虑使用或Executor服务

使用executor服务的一个快速示例是在启动时创建executor

ExecutorService service = Executors.newSingleThreadExecutor();
然后将作业提交给it

if (Test1.isEnabled()) {
    errorLabel.setText("");
    service.submit(()->{
        Result result = JUnitCore.runClasses(Test1.class);
        EventQueue.invokeLater(()->errorMessageDisplay(result));
    });
}
这将允许您提交多个作业,但它们将连续运行。您也可以通过gui控制作业流

if (Test1.isEnabled()) {
    test1.setEnabled(false);
    errorLabel.setText("");
    service.submit(()->{
        Result result = JUnitCore.runClasses(Test1.class);
        EventQueue.invokeLater(()->{
            errorMessageDisplay(result);
            test1.setEnabled(true);
        });
    });
}

最简单的解决方案是创建另一个线程

if (Test1.isEnabled()) {
    errorLabel.setText("");
    new Thread(()->{
        Result result = JUnitCore.runClasses(Test1.class);
        EventQueue.invokeLater(()->errorMessageDisplay(result));
    }).start();
}
这不是一个很好的解决方案,请考虑使用或Executor服务

使用executor服务的一个快速示例是在启动时创建executor

ExecutorService service = Executors.newSingleThreadExecutor();
然后将作业提交给it

if (Test1.isEnabled()) {
    errorLabel.setText("");
    service.submit(()->{
        Result result = JUnitCore.runClasses(Test1.class);
        EventQueue.invokeLater(()->errorMessageDisplay(result));
    });
}
这将允许您提交多个作业,但它们将连续运行。您也可以通过gui控制作业流

if (Test1.isEnabled()) {
    test1.setEnabled(false);
    errorLabel.setText("");
    service.submit(()->{
        Result result = JUnitCore.runClasses(Test1.class);
        EventQueue.invokeLater(()->{
            errorMessageDisplay(result);
            test1.setEnabled(true);
        });
    });
}


您需要在不同的线程上运行测试,因为您正在阻塞gui线程(EDT)。还有,为什么每次调用errorMessageDisplay时都要创建一个侦听器呢?问题是,我希望一次只能运行一个测试。那么我不需要创建一个新的lisener吗?我不知道你为什么需要一个新的侦听器,它看起来只是清除文本,并将标签设置为可见。如果单击它,它应该已经可见。你只是在积累监听器来做同样的事情。它不会通过“在JSwing中清除按钮单击操作上的文本字段”来清除文本。在Swing之前没有
J
。你需要在不同的线程上运行测试,你正在阻塞gui线程(EDT)。还有,为什么每次调用errorMessageDisplay时都要创建一个侦听器呢?问题是,我希望一次只能运行一个测试。那么我不需要创建一个新的lisener吗?我不知道你为什么需要一个新的侦听器,它看起来只是清除文本,并将标签设置为可见。如果单击它,它应该已经可见。你只是积累了一些监听器来做同样的事情。虽然“在JSwing中清除按钮单击操作上的文本字段”在Swing之前没有
J
,但它不会清除文本。如果我创建另一个线程,这是否意味着你可以并行运行多个测试?是的,你可以并行运行多个测试。如果这是你的目标,我肯定会建议你考虑执行人服务。所以你可以更好地控制它们的执行方式。我不能并行运行,不幸的是,我不知道你的意思。JUnitCore可能不允许您并行运行测试。或者它可能有自己的机制,我的意思是我的需求不允许并行运行测试。一个测试必须在另一个之后运行如果我创建了另一个线程,这是否意味着您可以并行运行多个测试?是的,您可以并行运行多个测试。如果这是你的目标,我肯定会建议你考虑执行人服务。所以你可以更好地控制它们的执行方式。我不能并行运行,不幸的是,我不知道你的意思。JUnitCore可能不允许您并行运行测试。或者它可能有自己的机制,我的意思是我的需求不允许并行运行测试。一个测试必须在另一个测试之后运行