Ola, consigo apenas imprimir um JFrame que esta visível, com o seguinte código.
/**
* Salva Imagem.
* @param frame JFrame que vai ser impresso
*/
public SaveImage(JFrame frame) {
BufferedImage bImage = new BufferedImage(frame.getWidth(), frame.getHeight(), BufferedImage.TYPE_INT_RGB);
Graphics g = bImage.getGraphics();
frame.paint(g);
try {
File file = new File("teste" + File.separator + "teste.png");
ImageIO.write(bImage, "png", file);
} catch (IOException ioe) {
ioe.getMessage();
}
}
Gostaria de saber como devo proceder para imprimir um JFrame e todo seu conteúdo sem que ele esteja visível?
se fazer o mesmo codigo so que com o frame este visible false ele naum aparece na imagem ? o que acontece se fizer isso ?
se isso naum funcionar acho que tera que deixar o frame visivel para fazer isso, acho que é a unica forma
boa sorte
Boa tarde CristianPalmaSola10, obrigado pela atenção, já tentei fazer isso mas a imagem fica toda preta, irei continuar as minhas pesquisas se mais alguém tiver alguma ideia fico agradecido.
Minha ideia é
frame.setVisible(true);
//faz a imagem
frame.setVisible(false);
Já tentou chamar o paint do ContentPane() do JFrame ao invés do JFrame direto?
Além disso, não esqueça de dar dispose() no objeto g após a pintura.
frame.getContentPane().paint(g);
g.dispose();
Faça o teste, mas provavelmente será necessário preencher a imagem com a cor de fundo que você quer.
CristianPalmaSola10, também tive esta idéia, mas não posso implementar, imagine no cliente aparecendo a tela e desaparecendo, estou praticamente reinventando a roda, pois o iReport não esta suprindo as necessidades de alguns relatórios dinâmicos que possuo.
ViniGodoy, não consegui implementar o que me passou, continuou me retornando uma imagem toda preta, segue em anexo o que já consegui desenvolver.
public class Main {
public static void main(String[] args0){
new SaveImage(new FrameTeste());
}
}
public class SaveImage {
/**
* Salva Imagem.
* @param frame JFrame que vai ser impresso.
*/
public SaveImage(JFrame frame) {
BufferedImage bImage = new BufferedImage(frame.getWidth(), frame.getHeight(), BufferedImage.TYPE_INT_RGB);
Graphics g = bImage.getGraphics();
// Conforme interpretado
frame.getContentPane().paint(g);
try {
File file = new File("teste" + File.separator + "teste.png");
ImageIO.write(bImage, "png", file);
} catch (IOException ioe) {
ioe.getMessage();
}
// Conforme interpretado
g.dispose();
}
}
public class FrameTeste extends JFrame{
private JButton button1, button2;
public FrameTeste(){
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setSize(400, 400);
this.setLayout(null);
this.setLocationRelativeTo(null);
this.button1 = new JButton("Teste");
this.button1.setBounds(10, 10, 200, 50);
this.add(this.button1);
this.button2 = new JButton("Teste 2");
this.button2.setBounds(70, 70, 200, 50);
this.add(this.button2);
}
}
Pelo que li nos fontes da classe JFrame, não é mesmo possível fazer isso.
PS: Parece que funciona deixar o JFrame minimizado e mandar pintá-lo. Ok, não é a solução mais elegante possível, mas é melhor que nada.
Faça um
frame.setExtendedState(JFrame.ICONIFIED);
Antes do setVisible. Pinte e feche o frame.
Fico extremamente grato pela ajuda, com certeza não é a melhor forma de se fazer o que necessito, mais enquanto não possuir outra solução implementarei esta.