BufferStrategy - IllegaStateException

12 respostas
F

ola galera,

porque esta dando essa exceção, quando vai criar a estratégia de Buffer?!

package Codigo;


import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;


public class Inicial  extends JFrame{
	BufferStrategy bs;
	private CarregarImagens imagens;
	public static int pWidth = 800;
	public static int pHeight = 600;
	JFrame f;	

	public Inicial() {
		f = new JFrame();
		Splash splash = new Splash();
		splash.setVisible(true);
		
		imagens = new CarregarImagens("ArquivoImagem.txt");
		splash.setVisible(false);
		
		setIgnoreRepaint(true);
		createBufferStrategy(2); //nessa linha a exceção
		bs = getBufferStrategy();
		new Janela1(pWidth,pHeight,imagens);
	}	
	
	
	
	public ImageIcon getImagem(String nome){   
        String caminhoDaImagem = "/Imagens2/" + nome;   
        ClassLoader classLoader = this.getClass().getClassLoader();   
        ImageIcon icone = new ImageIcon(getClass().getResource(caminhoDaImagem)); 
        return icone;   
    }  
	
	private class Splash extends JWindow {
		public Splash() {
			Container tela = getContentPane();
			tela.setLayout(new FlowLayout(FlowLayout.LEFT,1,1));
			
			JLabel rotulo = new JLabel();
			rotulo.setIcon(getImagem("splash.gif"));
			tela.add(rotulo);
			
			pack();
			setLocationRelativeTo(null);	
		}
		
	}
	
	public static void main(String args[]) {
		Inicial app = new Inicial();
		app.f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
}

e a mensagem de erro:

Exception in thread "main" java.lang.IllegalStateException: Component must have a valid peer
	at java.awt.Component$FlipBufferStrategy.createBuffers(Unknown Source)
	at java.awt.Component$FlipBufferStrategy.<init>(Unknown Source)
	at java.awt.Component$FlipSubRegionBufferStrategy.<init>(Unknown Source)
	at java.awt.Component.createBufferStrategy(Unknown Source)
	at java.awt.Window.createBufferStrategy(Unknown Source)
	at java.awt.Component.createBufferStrategy(Unknown Source)
	at java.awt.Window.createBufferStrategy(Unknown Source)
	at Codigo.Inicial.<init>(Inicial.java:27)
	at Codigo.Inicial.main(Inicial.java:57)

flw,

12 Respostas

ViniGodoy

Citando o Ponto V:

Fonte: http://pontov.com.br/site/java/48-java2d/124-desenho-direto-active-rendering

ViniGodoy

Para ter certeza que uma janela está visível, associe a ela um windowListener e escute pelo evento windowOpened.

Aí é só fazer lá:

public void windowOpened(WindowEvent evt) { if (bs == null) { createBufferStrategy(2); //nessa linha a exceção bs = getBufferStrategy(); } }

F

blz, não deu mais erro, mas agora não pinta?!, o que pode ser?!

package Codigo;

import javax.swing.*;
import java.awt.event.*;
import java.awt.image.*;
import java.awt.*;
import java.util.List;
import java.util.ArrayList;


public class Janela1 extends JFrame {
	int pWidth, pHeight;
	CarregarImagens imagens;
	static int posX;
	static int posY;
	int xis = 50;
	static int x1[] = new int[21];
	static int y1[] = new int[21];
	BufferStrategy bs;
	PintarImagem pi;
	JPanel superior,inferior;
	String s;
	
	int j = 0;
	
	ArrayList addIma = new ArrayList();
	private Point[] points = new Point[10000];
	private int pointCount = 0;
	Image nome3[] = new Image[21];
	List<Image> listaImagens = new ArrayList<Image>();
	
	public Janela1(int x, int y, CarregarImagens ci) {
		
		pWidth =x;
		pHeight = y;
		imagens = ci;
	
		Container c = getContentPane();
		c.setLayout(null);
	
		setTitle("Escolha uma opção");
		setBackground(Color.white);
		setVisible(true);
		setSize(pWidth,pHeight);
		setResizable(true);
		setIgnoreRepaint(true);
		createBufferStrategy(2); 
		bs = getBufferStrategy();
		
		
		/*superior = new PintarImagem(pWidth,pHeight,imagens,bs);
		c.add(superior);
		superior.setBounds(10,10,pWidth,pHeight);
		superior.setBorder(BorderFactory.createLineBorder(Color.red,03));
		*/
		pinte();
		addMouseListener(new Tratador());
		//Aqui aonde estão as imagens que serão clicadas pelo mouse
	/*	
		JLabel rotulo1 = new JLabel("");
		rotulo1.setIcon(getImagem("00021.gif"));
		rotulo1.setBounds(50,pHeight-440,90,90);
		
		JLabel rotulo2 = new JLabel("");
		rotulo2.setIcon(getImagem("00031.gif"));
		rotulo2.setBounds(150,pHeight-440,90,90);
		
		JLabel rotulo3 = new JLabel("");
		rotulo3.setIcon(getImagem("00111.gif"));
		rotulo3.setBounds(620,pHeight-440,90,90);
		c.add(rotulo1);
		c.add(rotulo2);
		c.add(rotulo3);
		*/
		/*
		inferior = new EventImagem(pWidth,pHeight,imagens);
		c.add(inferior);
		inferior.setBounds(10,pHeight-200,pWidth,200);
		inferior.setBorder(BorderFactory.createLineBorder(Color.red,03));
		addMouseListener(new Tratador());
		//aqui aonde eu pintaria as imagens que foi clicado no JPanel superior
		*/
	}
	
	
/*	public ImageIcon getImagem(String nome){   
        String caminhoDaImagem = "/Imagens2/" + nome;   
        ClassLoader classLoader = this.getClass().getClassLoader();   
        ImageIcon icone = new ImageIcon(getClass().getResource(caminhoDaImagem)); 
        return icone;   
    }  */
	
	public void pinte() { 
		Graphics2D g = (Graphics2D) bs.getDrawGraphics();
		int x =50, y =50; 
 		String s;
 		//System.out.println("pWidth: " + pWidth);
 		for(int i = 0; i <= 20; i++) {
			if(x > pWidth - 100) {
				y = y + 100;
				x = 50;
				x1[i] = x;
				y1[i] = y;
			}		
			try {
				s = (String)imagens.id.get(i); 
				nome3[i] = imagens.getImage(s, i);
				g.drawImage(nome3[i], x,y,this);
				bs.show();
				x1[i] = x;	
				x = x + 100;
			}	
			catch(Exception e) {
			e.printStackTrace();
			}		
		}			
 	
 	}
	
	
	private class Tratador extends MouseAdapter {
		public void mousePressed(MouseEvent e) { 
			String s;// --ö)
			posX = e.getX();
			posY = e.getY();
			PintarImagem.evento(posX,posY);
			pintar();
		}
	}

	public void pintar() {
		Graphics g = bs.getDrawGraphics();
		for(int i = 0; i<=20;i++) {
			if(((posX >= pi.x1[i])&&(posX <= pi.x1[i] + 90))&&
					((posY >= y1[i])&&(posY <= y1[i] + 90))) {	
					try {
					BufferedImage bi = new BufferedImage(90,90,BufferedImage.TYPE_INT_RGB);
					System.out.println("bufferedImage: " + bi);
					s = (String) imagens.id.get(i);
					System.out.println("s: "  + s);
					bi = imagens.getImage(s,i);
					listaImagens.add(bi);
					g.drawImage(bi,xis,pHeight-100,null);
					/*for(int z = 0; z < addIma.size(); z++) {
						g.drawImage(nome3[z],aux[z], pHeight-100, null);
					}*/
					xis = xis + 100;
					g.dispose();
					bs.show();
					}
					
					catch(Exception e) {
						e.printStackTrace();
					}
			}
			
		}
	}

		
}
F

E ae galera, ai fica dificil de usar isso, pois qualquer erro todo mundo para de responder quando fala de rendernização ativa, ai quando vou usar um framework, todo mundo fala que o java2D é muito bom, ainda não vi o quanto é bom, pois não aparece nenhuma figura…fica muito dificil em desenvolver realmente com essa ferramenta…

F

Vou postar de novo os codigos que eu fiz atualizados:

package Codigo;

import javax.swing.*;
import java.awt.event.*;
import java.awt.image.*;
import java.awt.*;
import java.util.List;
import java.util.ArrayList;


public class Janela1 extends JFrame {
	int pWidth, pHeight;
	CarregarImagens imagens;
	static int posX;
	static int posY;
	int xis = 50;
	static int x1[] = new int[21];
	static int y1[] = new int[21];
	BufferStrategy bs;
	PintarImagem pi;
	JPanel superior,inferior;
	String s;
	
	int j = 0;
	
	ArrayList addIma = new ArrayList();
	private Point[] points = new Point[10000];
	private int pointCount = 0;
	Image nome3[] = new Image[21];
	List<Image> listaImagens = new ArrayList<Image>();
	
	public Janela1(int x, int y, CarregarImagens ci) {
		
		pWidth =x;
		pHeight = y;
		imagens = ci;
	
		Container c = getContentPane();
		c.setLayout(null);
	
		setTitle("Escolha uma opção");
		setBackground(Color.white);
		setVisible(true);
		setSize(pWidth,pHeight);
		setResizable(true);

		
		
		setIgnoreRepaint(true);
		createBufferStrategy(2); 
		bs = getBufferStrategy();
		
		
		superior = new PintarImagem(pWidth,pHeight,imagens,bs);
		c.add(superior);
		superior.setBounds(10,10,pWidth,pHeight);
		superior.setBorder(BorderFactory.createLineBorder(Color.red,03));
	
		
		
		addMouseListener(new Tratador());
		//Aqui aonde estão as imagens que serão clicadas pelo mouse
	/*	
		JLabel rotulo1 = new JLabel("");
		rotulo1.setIcon(getImagem("00021.gif"));
		rotulo1.setBounds(50,pHeight-440,90,90);
		
		JLabel rotulo2 = new JLabel("");
		rotulo2.setIcon(getImagem("00031.gif"));
		rotulo2.setBounds(150,pHeight-440,90,90);
		
		JLabel rotulo3 = new JLabel("");
		rotulo3.setIcon(getImagem("00111.gif"));
		rotulo3.setBounds(620,pHeight-440,90,90);
		c.add(rotulo1);
		c.add(rotulo2);
		c.add(rotulo3);
		*/
		/*
		inferior = new EventImagem(pWidth,pHeight,imagens);
		c.add(inferior);
		inferior.setBounds(10,pHeight-200,pWidth,200);
		inferior.setBorder(BorderFactory.createLineBorder(Color.red,03));
		addMouseListener(new Tratador());
		//aqui aonde eu pintaria as imagens que foi clicado no JPanel superior
		*/
	}
	
	
/*	public ImageIcon getImagem(String nome){   
        String caminhoDaImagem = "/Imagens2/" + nome;   
        ClassLoader classLoader = this.getClass().getClassLoader();   
        ImageIcon icone = new ImageIcon(getClass().getResource(caminhoDaImagem)); 
        return icone;   
    }  */
	/*
	public void pinte() { 
		Graphics2D g = (Graphics2D) bs.getDrawGraphics();
		int x =50, y =50; 
 		String s;
 		//System.out.println("pWidth: " + pWidth);
 		for(int i = 0; i <= 20; i++) {
			if(x > pWidth - 100) {
				y = y + 100;
				x = 50;
				x1[i] = x;
				y1[i] = y;
			}		
			try {
				BufferedImage bi = new BufferedImage(90,90,BufferedImage.TYPE_INT_RGB);
				s = (String)imagens.id.get(i); 
				bi = imagens.getImage(s, i);
				g.drawImage(bi, x,y,this);
				if(!getBufferStrategy().contentsLost())
					bs.show();
				x1[i] = x;	
				x = x + 100;
			}	
			catch(Exception e) {
			e.printStackTrace();
			}		
		}			
 	
 	}
	
	*/
	private class Tratador extends MouseAdapter {
		public void mousePressed(MouseEvent e) { 
			String s;// --ö)
			posX = e.getX();
			posY = e.getY();
			pintar(posX,posY);
		}
	}

	public void pintar(int x, int y) {
		Graphics2D g = (Graphics2D) bs.getDrawGraphics();
		posX = x;
		posY = y;
		for(int i = 0; i<=20;i++) {
			if(((posX >= pi.x1[i])&&(posX <= pi.x1[i] + 90))&&
					((posY >= y1[i])&&(posY <= y1[i] + 90))) {	
					try {
					BufferedImage bi = new BufferedImage(90,90,BufferedImage.TYPE_INT_RGB);
					System.out.println("bufferedImage: " + bi);
					s = (String) imagens.id.get(i);
					System.out.println("s: "  + s);
					bi = imagens.getImage(s,i);
					listaImagens.add(bi);
					g = bi.createGraphics();
					g.drawImage(bi,xis,pHeight-100,null);
					/*for(int z = 0; z < addIma.size(); z++) {
						g.drawImage(nome3[z],aux[z], pHeight-100, null);
					}*/
					xis = xis + 100;
					if(!getBufferStrategy().contentsLost())
						bs.show();
					}
					
					catch(Exception e) {
						e.printStackTrace();
					}
			}
			
		}
	}

		
}
package Codigo;


import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferStrategy;
import java.awt.image.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class PintarImagem extends JPanel {
	
	Image nome3;
	static CarregarImagens ima;
	static int y1[] = {50,50,50,50,50,50,50,150,150,150,150,150,150,150,250,250,250,250,250,250,250};
	int x2[] = new int[21];
	static int x1[] = new int[21];
    static int pWidth;
	static int pHeight;
    static int posX,posY;
    static boolean passou2;
    int xis2 = 50;
    int j = 0;
    JPanel superior;
    List<Image> listaImagens = new ArrayList<Image>();
    int xis = 50;
    int aux[] = new int[21];
    BufferStrategy bs;
    
	public PintarImagem(int w, int h, CarregarImagens c, BufferStrategy b) {
		ima = c;
		pWidth = w;
		pHeight = h;
		bs = b;
		setIgnoreRepaint(true);
		pinte();
	}
	public static void evento(int x1,int x2) {
		posX = x1;
		posY = x2;
	}

	public void pinte() { 
		Graphics2D g = (Graphics2D) bs.getDrawGraphics();
		
		int x =50, y =50; 
 		String s;
 		//System.out.println("pWidth: " + pWidth);
 		for(int i = 0; i <= 20; i++) {
			if(x > pWidth - 100) {
				y = y + 100;
				x = 50;
				x1[i] = x;
				y1[i] = y;
			}		
			try {
				BufferedImage nome2 = new BufferedImage(90,90,BufferedImage.TYPE_INT_ARGB);
				s = (String)ima.id.get(i); 
				nome2 = ima.getImage(s, i);
				g = nome2.createGraphics();
				g.drawImage(nome2, x,y,this);
				if(!bs.contentsLost())
					bs.show();
				x1[i] = x;	
				x = x + 100;
			}	
			catch(Exception e) {
			e.printStackTrace();
			}		
		}			
 	
 	}

}
ViniGodoy

Cara, não é que “todo mundo para de responder”. É que era domingo de Páscoa. As pessoas (como eu) gostam de passar o dia com a família, ou de não usar o computador no final de semana.

Primeiramente, vai ser muito difícil desenhar com um código tão bagunçado. Não é à toa que nada aparece.
Eu sugiro que você estude aos poucos. Comece fazendo um programa que apenas desenhe uma linha na tela. Em seguida, tente desenhar uma imagem. Em seguida, tente faze-la mover-se (é um passo longo, pois envolve criar um loop de animação).

Vá evoluindo passo-a-passo.

Outra coisa, ter tantas variáveis static é geralmente um sinal de problemas. Você conhece bem os conceitos básicos de orientação à objetos? Se nem isso você conhecer, tentar usar o Java2D é mesmo tentar dar um passo maior do que as pernas.

ViniGodoy

Quanto ao fato do seu código não pintar…

A renderização ativa assume que você chamará a função de pintura, sempre que for necessário. Normalmente, criamos para isso um loop de animação (se não for para ser assim, iremos usar a renderização passiva, pois o Swing nos informará como pintar).

Você não tem esse loop. Só está chamando pintar uma única vez.

Sem mandar pintar, não o Java não pinta mesmo.

F

Para vc usar a rendernização vc terá que colocar as imagens dentro de um loop, ou seja, o programa ficará dentro de um loop como se fosse num game!?, se eu não criar esse loop pode ser que o programa não funcione corretamente…

F

Uma dúvida que bateu, que toda vez que eu carregar uma nova imagem terei que passar o contexto gráfico para Graphics?!

ViniGodoy

Freak_266:
Para vc usar a rendernização vc terá que colocar as imagens dentro de um loop, ou seja, o programa ficará dentro de um loop como se fosse num game!?, se eu não criar esse loop pode ser que o programa não funcione corretamente…

Sim. Por isso chamamos de renderização ativa. Nós é que temos que mandar o Java Renderizar, ativamente.
Se você quiser que o Swing gerencie isso, nesse caso, use renderização passiva. Aí ele se encarrega de chamar o paintComponent.

Ela terá que ser desenhada no Graphics. Normalmente carregamos tudo o que vai ser desenhado num list, e fazemos o List desenhar tudo.
Ao carregar uma nova imagem, ela só seria acrescentada a esse list.

F

Então, Vini, eu to usando a rendernização ativa, pois com a rendernização passiva o java estava apagando umas imagens e tudo ele dava repaint, eu acredito que com a ativa isso vai ser mais dificil de acontecer…

F

Como assim, o List pinta tudo… tipow, o list é um recipiente?!

Criado 7 de abril de 2012
Ultima resposta 9 de abr. de 2012
Respostas 12
Participantes 2