所以我的代码基本上有一个带有一些文本字段和JPanel
的{{1}},当用户点击按钮时,它转到按钮监听器,然后从文本字段中获取数据处理它,创建JButton
,它将其添加到另一个不可见的JLabels
。然后我让第一个JPanel不可见,并使第二个面板可见,揭示我生成的“结果”。
这一切都有效,但问题是,当我的程序处理从文本字段中获取的数据时,我希望JPanel
更改它所说的内容,并且我已经尝试使用JButton
,并且我能够发现它正在更改按钮文本(通过打印到控制台),但它没有更新带有更改文本的按钮。
在此之后我尝试了所有形式的重新验证并重新绘制和验证,但没有一个工作。有任何想法吗?谢谢!
event.getSource().setText()
答案 0 :(得分:4)
原因是在作业完成之前没有处理任何绘画事件,因此{I} setText
的效果将在您认为不会显示。
repaint()
只承诺“尽快”重新绘制(按照文档),但由于绘制事件在与按钮点击事件(“事件调度线程”)相同的线程上处理,因此您的处理有效导致setText
调用和面板隐藏/显示同时发生(可以这么说),在作业完成后发生。
如果您的工作需要相当长的时间,那么使用数据处理作业阻止EDT的效果是显而易见的 - 由于EDT没有任何机会重新绘制,处理调整大小/鼠标点击事件,UI将变得完全没有响应等。
重处理应该在后台线程中进行,最好是SwingWorker
的帮助。这使得EDT可以自由处理油漆(和其他)事件。