JPanel como imagem [Resolvido]

15 respostas
felixcomputer

Pessoal, gostaria de saber se é possivel eu “exportar” um JPanel como imagem, isso pode parecer meio doido, mas eu tenho um JPanel com um monte de coisas dentro dele e queria salvar uma imagem desse meu JPanel, não é bem um exportar…ficou estranho, é como dar um “Print Screen” do JPanel, é possível fazer essa loucura?

15 Respostas

LucasPoli

Não entendi.

Por que exatamente você não pode usar o PrintScreen ?

LuizLG

Ve se é isso resolve seu problema…

Toolkit toolkit = Toolkit.getDefaultToolkit();

Dimension screenSize = toolkit.getScreenSize();

Rectangle screenRect = new Rectangle(screenSize);
try{
    robot = new Robot();
}catch(Exception e){
    System.out.println("ERRO _ ROBOT");
}
						BufferedImage imgcapturada = (BufferedImage)robot.createScreenCapture(screenRect);
felixcomputer

SkyWalker, eu gostaria que a minha ferramenta fizesse isso, e não eu :lol:

LuizLG, eu fiz o seguinte, peguei esse código que vc me mandou e criei um novo JPanel passando como argumento para o método paintComponents (Graphics) o que vc me passou, entretanto, não gerou nada. Vc conseguiu fazer funcionar ae?

Toolkit toolkit = Toolkit.getDefaultToolkit();
    	 Dimension screenSize = toolkit.getScreenSize();
    	 Rectangle screenRect = new Rectangle(screenSize);
    	 Robot robot = null;
    	 try{
    	 robot = new Robot();
    	 }catch(Exception e){
    	 System.out.println("ERRO _ ROBOT");
    	 }
    	 BufferedImage imgcapturada = (BufferedImage)robot.createScreenCapture(screenRect);
    	 JPanel a = new JPanel();
    	 a.paintComponents(imgcapturada.createGraphics());
    	 tab.add(a);

Obrigado pessoal

LuizLG

Sobreescreve o método Paint que dá certo.

Eita… só que agora percebi que assim vai tirar screenshot da tela inteira…Mas talvez se vc passar a localização do jpanel e o tamanho fique certo…

Melhor: dá uma olhada na classe Robot, deve ter como tirar screenshot só do componente!

Vou dar uma olhada tb, qualquer coisa volto =pp

JPanel a = new JPanel(){
    		 public void paint(Graphics g){
    		        Toolkit toolkit = Toolkit.getDefaultToolkit();
//    		    	 Dimension screenSize = toolkit.getScreenSize();
    		         Point pt = new Point(50,50);
    		    	 Rectangle screenRect = new Rectangle(pt, screenSize);
    		    	 Robot robot = null;
    		    	 try{
    		    	 robot = new Robot();
    		    	 }catch(Exception e){
    		    	 System.out.println("ERRO _ ROBOT");
    		    	 }
    		    	 BufferedImage imgcapturada = (BufferedImage)robot.createScreenCapture(screenRect);
    			 g.drawImage(imgcapturada, 20, 20, null);
    		 }
    	 };
felixcomputer

Blz Luiz, vou dar uma olhada!

LuizLG

Achei…
Fora do jPanel vc usa o getBounds pra pegar as dimensoes, depois o ScreenCapture, testa ae!

Rectangle r = jPanel.getBounds();
BufferedImage image = new Robot().createScreenCapture®;

felixcomputer

Ele ta capturando do tamanho do JPanel, contudo, a localização está errada, tentei passar um getLocation, mas naum funcionou, vou ter que pensa numa solução melhor, que não dependa de uma localização e sim do componente, será que dá?
Obrigado Luiz :lol:

LuizLG

Você tambem tem a opção de ‘imprimir’ em um arquivo direto, ao inves de imprimir na impressora direcionar para um arquivo de imagem. Mas agora não sei qual seu interesse, se é apenas usar no programa mesmo…

felixcomputer

A minha idéia é gerar arquivo de imagem com isso, eu tava colocando no JPanel só pra visualizar a imagem. Como posso direcionar para um arquivo de imagem esse BufferedImage (sem querer abusar da sua paciência). Vou procurar…
Obrigado Luiz

LuizLG

http://forum.java.sun.com/thread.jspa?threadID=477654&messageID=2220990

:wink:

felixcomputer

Valeu Luiz
:thumbup:

LuizLG

Td funcionando perfeito? xD

felixcomputer

Não, pq esse metodo write recebe como argumento um RenderedImage e não um bufferedImage, mas eu vou pesquisar sobre como faz isso, e quanto ao print screen, ainda ta com aquele problema, mas agora acho que é só pensar um pouco, vou dar uma pesquisada, o mais difícil já foi. Posso postar aki quando conseguir,
Valeus

ViniGodoy

Tudo bem se for chamar o paint para pintar um BufferedImage, como no tópico.

Mas sempre que for sobrescrever no Swing, sobrescreva paintComponent().

O método paint é dividido em três partes:

  1. paintBorder();
  2. paintComponent();
  3. paintChildren().

Sobrescreve-lo pode fazer com que o Java pule uma dessas etapas, gerando um painel de comportamento estranho.

root_

Soh para firmar mais um pouquinho… pois aki tb funcionou direitinho, dessa forma:

int width = jPanel3.getWidth();
    int height = jPanel3.getHeight();
    BufferedImage image = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);
    g2 = image.createGraphics();
    jPanel3.paint(g2);
    g2.dispose();
    RenderedImage img = image;
    try {
      ImageIO.write(img, "png", new File("mypanel.png"));
    }
    catch(IOException ioe) {
      System.out.println(ioe.getMessage());
    }
Criado 23 de janeiro de 2007
Ultima resposta 6 de mai. de 2008
Respostas 15
Participantes 5