在 JButton 操作上多次替换 JLabel 文本

Posted

技术标签:

【中文标题】在 JButton 操作上多次替换 JLabel 文本【英文标题】:Replace JLabel text multiple times on JButton action 【发布时间】:2021-08-06 17:51:05 【问题描述】:

点击JButton 时,我需要使用setText 清空JLabel。在actionPerformed 内部,我还有另一个Java 类调用。

如果它返回异常,那么我必须将标签更改为setText("Error occurred")

如果它返回结果,我必须将相同的标签更改为setText("Process completed")

我试图生成一个异常并且它工作正常,但是当我再次单击该按钮时,文本不会被空字符串替换。相反,它仍然显示“发生错误”。

请查看下面的代码,让我知道我需要更改什么。

btnConvert.addActionListener(new ActionListener() 
    public void actionPerformed(ActionEvent e) 
        
        label1.setText("");

        if(lblSource.getText().isEmpty()) 
            label2.setText("You have missed to select!! Please select it");
        
        else 
            label1.setText("processing... ");
            VelConverter v = new VelConverter(locations);
            String response = v.convert();
            if(response.startsWith("Exception"))   
                //code
                label1.setText("Error Occurred");
                
            
            else 
                //code
                label1.setText("Completed");
            
        
    

【问题讨论】:

1) 为了尽快获得更好的帮助,edit 添加minimal reproducible example 或Short, Self Contained, Correct Example。 2) 问题听起来像是代码阻塞了 EDT。不要阻塞 EDT(事件调度线程)。发生这种情况时,GUI 将“冻结”。有关详细信息和修复,请参阅 Concurrency in Swing。 空值和“处理中...”消息将永远不会显示,因为 GUI 只能在处理未决事件之后更新。根据您的代码,处理后只有“已完成”和“发生错误”是可能的标签值。请记住,Swing 是单线程的,如果您在 ActionListener 中进行长时间处理,您应该考虑使用 SwingWorker 来完成繁重的工作。 Andrew Thompson 编辑了代码。我还将检查 Swing 中的并发性 “编辑了代码。” 你为什么告诉我?更重要的是,我们什么时候可以看到 MRE / SSCCE? 提示:添加@Rocco(或任何重要的@)以通知此人有新评论。很高兴你解决了。 :) 【参考方案1】:

感谢 Rocco 和 Andrew Thomson。您关于并发的建议使我研究了 Swing worker。我刚刚使用 Swing worker 分离了线程,我能够达到我的要求。

这个链接让我明白了 Swing 的工作原理很简单。 https://www.geeksforgeeks.org/swingworker-in-java/

【讨论】:

以上是关于在 JButton 操作上多次替换 JLabel 文本的主要内容,如果未能解决你的问题,请参考以下文章

JButton、JTextFeild、JLabel 设置背景颜色不起作用

如何让 Swing 将我自己的 HTMLEditorKit 用于 JLabel/JButton/等

绘制一个 JButton 看起来像一个 JLabel(或者至少没有按钮边缘?)

如何相对于另一个组件布局组件?

当面板中的 JButton 悬停时,JPanel 上的 MouseExited 运行?

GUI基础1