gpt4 book ai didi

java - 当我删除 frame.add(Component) 时,组件必须是有效的对等体

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:53:23 26 4
gpt4 key购买 nike

我这里有这段代码,用于创建像素数组并将其绘制到图像中:

import javax.swing.JFrame;
import java.awt.Canvas;
import java.awt.Graphics;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferInt;

public class test extends Canvas implements Runnable {

private static final long serialVersionUID = 1L;
public static int WIDTH = 800;
public static int HEIGHT = 600;
public boolean running = true;
public int[] pixels;
public BufferedImage img;
public static JFrame frame;
private Thread thread;

public static void main(String[] arg) {
test wind = new test();
frame = new JFrame("WINDOW");
frame.add(wind);
frame.setVisible(true);
frame.setSize(WIDTH, HEIGHT);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
wind.init();
}

public void init() {
thread = new Thread(this);
thread.start();
img = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
pixels = ((DataBufferInt) img.getRaster().getDataBuffer()).getData();
}

public void run() {
while (running) {
render();
try {
thread.sleep(55);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

public void render() {
BufferStrategy bs = this.getBufferStrategy();
if (bs == null) {
createBufferStrategy(4);
return;
}
drawRect(0, 0, 150, 150);
Graphics g = bs.getDrawGraphics();
g.drawImage(img, 0, 0, WIDTH, HEIGHT, null);
g.dispose();
bs.show();

}

private void drawRect(int x, int y, int w, int h) {
for (int i = x; i < w; i++) {
for (int j = x; j < h; j++) {
pixels[i + j * WIDTH] = 346346;
}
}


}
}

当我删除以下行时,为什么会出现“Component must be a valid peer”错误:

frame.add(wind);

我为什么要删除它?因为我想使用类对象(来自另一个文件)创建一个框架并使用代码 Window myWindow = new Window() 来做完全相同的事情。

最佳答案

正如@nIcE cOw 评论的那样,你似乎是 Mixing Heavyweight and Lightweight Components .替换 Frame 仍然存在潜在问题:createBufferStrategy()抛出异常是因为 Canvas 在添加到 Frame 之前是不可显示的,这依赖于宿主平台提供的重量级对等组件的特性。实际上,您是在尝试选择一个 BufferStrategy 而未指定应使用该策略的缓冲区。

相反,使用现有的 engine ,或者依赖于 JComponent 提供的默认缓冲策略,对于 example .

Exception in thread "Thread-2" java.lang.IllegalStateException: Component must have a valid peer    at java.awt.Component$FlipBufferStrategy.createBuffers(Component.java:3843)    at java.awt.Component$FlipBufferStrategy.(Component.java:3817)    at java.awt.Component$FlipSubRegionBufferStrategy.(Component.java:4358)    at java.awt.Component.createBufferStrategy(Component.java:3699)    at java.awt.Canvas.createBufferStrategy(Canvas.java:166)    at java.awt.Component.createBufferStrategy(Component.java:3623)    at java.awt.Canvas.createBufferStrategy(Canvas.java:141)    at test.render(test.java:52)    at test.run(test.java:40)    at java.lang.Thread.run(Thread.java:680)

关于java - 当我删除 frame.add(Component) 时,组件必须是有效的对等体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11159047/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com