如何解决如何在另一个线程中绘制一个JFrame?
我试图使JFrame的paint()
方法启动一个线程,然后使用Graphics
渲染该线程的形状(在单独的文件中)。当我尝试执行此操作时,没有任何显示。
//JFrame
public class Window extends JFrame {
public Window() {
this.setTitle("Test");
this.setSize(1280,720);
this.setLocationRelativeTo(null);
this.setVisible(true);
}
public void paint(Graphics g) {
new ThreadForRendering(g).start();
}
// Thread I'm trying to run
public class ThreadForRendering extends Thread {
private final Graphics g;
public ThreadForRendering(Graphics g) {
this.g = g;
}
public void run() {
this.g.setColor(Color.RED);
this.g.fillRect(0,500,500);
}
}
我尝试将super.paintComponent(g);
添加到paint方法中,并在线程启动后在窗口上调用repaint()
,但是窗口仍然空白。
解决方法
paint
被称为对GUI线程上所需的重新绘制的响应,并且应该很快发生。突破该方案只会导致问题,黑屏问题最少。
@Override public void paintComponent
应该是您的绘画实现。
应该很快。
如果要绘制复杂而缓慢的内容,可以填充BufferedImage
,然后可以在paintComponnent
中绘制。
private AtomicReference<BufferImage> imgRef = new AtomicReference<>();
@Override
public void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D)g;
BufferedImage img = img.get();
if (img != null) {
g2.draw img ...
}
}
在线程中:
BufferedImage constructedImg = new ...
Graphics g = constructedImg.createGraphics();
try {
g.fillRect ...
} finally {
g.dispose();
}
imgRef.set(constructedImg);
通常,绘画是智能完成的:JPanel通常是双缓冲,绘画是在缓冲区中完成的,然后覆盖实际显示的缓冲区。因此,在大多数情况下,不需要解析到另一线程。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。