Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 删除frame.add(组件)时,组件必须是有效的对等方_Java_Swing_Awt_Bufferedimage - Fatal编程技术网

Java 删除frame.add(组件)时,组件必须是有效的对等方

Java 删除frame.add(组件)时,组件必须是有效的对等方,java,swing,awt,bufferedimage,Java,Swing,Awt,Bufferedimage,我这里有一段代码,用于创建像素数组并将其绘制到图像中: 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

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

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;
            }
        }


    }
}

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

作为@nIcE cOw comments,您似乎是。替换
Frame
仍然会留下潜在的问题:抛出异常,因为
画布
在添加到
Frame
之前不可显示,这依赖于主机平台提供的重量级对等组件的功能。实际上,您正在尝试选择一个
缓冲区策略
,而没有指定哪个缓冲区应该使用该策略

相反,请使用现有的缓冲区策略,或依赖
JComponent
提供的默认缓冲区策略

线程“thread-2”java.lang.IllegalStateException中的异常:组件必须具有有效的对等方 位于java.awt.Component$FlipBufferStrategy.createBuffers(Component.java:3843) 位于java.awt.Component$FlipBufferStrategy(Component.java:3817) 位于java.awt.Component$FlipSubcionBufferStrategy(Component.java:4358) 位于java.awt.Component.createBufferStrategy(Component.java:3699) 位于java.awt.Canvas.createBufferStrategy(Canvas.java:166) 位于java.awt.Component.createBufferStrategy(Component.java:3623) 位于java.awt.Canvas.createBufferStrategy(Canvas.java:141) 在test.render(test.java:52) at test.run(test.java:40) 运行(Thread.java:680)
这是一个摇摆的时代,为什么你要使用
Canvas
,为什么不使用
JPanel
的重要特性,即
DoubleBuffering
,为什么不扩展
JPanel
而不是旧模式
Canvas
?此外,为什么你用
Thread.sleep(…)
这样的代码行来阻止你的EDT,为什么不用于此目的?@Downvoter:有什么可靠的理由来否决这个吗?@nIcE cOw你吸引了我的注意:Timers和JPanel?嗯,你能给我看看你的代码版本吗?@nIcEcOw:我看不到反对票;您可能看到了意外的咔哒声。另见?@boyd:试试这方面的任何版本,尤其是“垃圾神”,这是一个很好的例子。+1,但愿我知道Java绘画,有那么深的深度。LOL每天都在学习这部分:-)
frame.add(wind);
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)