You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JTextField.getText与JButton.addActionListener是否需在EDT执行?示例程序是否有误?

这个Swing程序确实存在线程安全问题

Swing有明确的线程安全规则:所有涉及Swing组件的操作(包括组件属性访问、事件监听器添加等)必须在事件调度线程(EDT)上执行,否则可能引发UI状态异常、线程竞争甚至程序崩溃等未定义行为。

看你给出的代码:

  • SwingUtilities.invokeAndWait( () -> showGUI() ) 确保了UI组件的创建在EDT上完成,但后续的x行和y行是在main线程(非EDT)执行的:
    • x行:System.out.println( text.getText() ) 直接在非EDT线程访问Swing组件的属性,违反线程安全规则。
    • y行:button.addActionListener( System.out::println ) 在非EDT线程给Swing组件添加事件监听器,同样违反规则。

这类操作在简单场景下可能不会立刻出现问题,但属于不安全的编码方式,不可依赖。正确的做法是把这两行也放到EDT中执行,比如用SwingUtilities.invokeLater包裹:

SwingUtilities.invokeLater(() -> {
    System.out.println( text.getText() );
    button.addActionListener( System.out::println );
});

内容的提问来源于stack exchange,提问作者Jack Straub

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 19:17:41