JPanel 上活动绘图之上的 JTextFields:线程问题
假设您想在可以添加哪些 Swing 用户界面元素。这涉及到在不需要更新每一帧的背景上对红色矩形进行动画处理。相反,背景被渲染到 BufferedImage 上,并且仅重绘了清除矩形先前位置所需的部分。
但是,在将 JTextField 添加到 JPanel 并关注它之后,清除了先前的位置每次光标闪烁时矩形的失败。这是因为 Swing 不是线程安全的,并且图像是异步绘制的。
要解决此问题,您需要调用超类的方法并在 PaintComponent() 方法中删除旧的绘制:
@Override protected void paintComponent(Graphics g) { super.paintComponent(g); int width = this.getWidth(); int height = this.getHeight(); g.setColor(Color.black); g.fillRect(0, 0, width, height); ... }
或者,您可以根据需要简化代码并进行优化。例如,您可能不需要使用插入、额外缓冲区或组件侦听器。
附录:
在构造函数中设置背景颜色就不需要使用在paintComponent()中填充面板,而super.paintComponent()允许文本字段正常工作。如前所述,这种解决方法很脆弱。最好简化代码并根据需要进行优化。
附录 2:
super.paintComponent() 调用 UI delegate 的 update() 方法,该方法填充如果其 opaque 属性为 true,则指定组件及其背景颜色。您可以使用 setOpaque(false) 来防止这种情况。
以上是在 JPanel 上组合 JTextField 和动画绘图时,如何防止 Swing 的线程问题?的详细内容。更多信息请关注PHP中文网其他相关文章!