Ae, começei a estudar a classe Graphics… e estou vendo como desenha uma imagem no frame, sem o JLabel(Icon). Como faço para chamar o método abaixo? Ou o que eu tenho que mudar???
O método read da ImageIO aceita um File ou um ImputStream ou uma URL como parametro para carregar a imagem.
victorwss
Sobrescreva o método paintComponent(Graphics g) do seu componente para fazer o desenho.
public class MeuComponente extends JComponent {
public void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
InputStream imgStream = getClass().getResourceAsStream("jog.PNG");
BufferedImage image = ImageIO.read(imgStream);
g2.drawImage(image, 100, 100, frame);
}
}
Você pode extender alguma outra coisa se quiser (JLabel por exemplo), desde que essa coisa seja subclasse de JComponent.
M
malstryx
Certo, aparentemente deu certo, só que a imagem não aparece, eu tenho que chamar este método de alguma forma??? pois já vi exemplos que não o chama mas ele executa isso que não entendi… ta assim:
Certo, aparentemente deu certo, só que a imagem não aparece, eu tenho que chamar este método de alguma forma??? pois já vi exemplos que não o chama mas ele executa isso que não entendi… ta assim:
Sobrescreva o método paintComponent. Esse método é chamado pelo AWT para renderizar os componentes.
Marky.Vasconcelos
O método paintComponent é chamado.
E outra coisa sempre que for modificar o Graphics que vem como argumento crie outro para trabalhar como Graphics2D depois libere
publicvoidpaintComponent(Graphicsg){Graphics2Dg2d=(Graphics2D)g.create();//cria//Trabalha com o g2d (Pinta, coloca imagens, etc..)g2d.dispose();//libera}
M
malstryx
Fiz o que vocês passaram… pq não está aparecendo a imagem?
importjava.awt.*;importjava.awt.image.*;importjavax.swing.*;importjava.io.*;importjavax.imageio.ImageIO;publicclassTesteextendsJComponent{JFrameframe;JPanelpanel;Teste(){frame=newJFrame("Game");panel=newJPanel();panel.setLayout(null);panel.setBackground(Color.WHITE);frame.getContentPane().add(panel);frame.setVisible(true);frame.setSize(800,600);frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);}publicvoidpaintComponent(Graphicsg){try{Graphics2Dg2=(Graphics2D)g;InputStreamimgStream=getClass().getResourceAsStream("jog.PNG");BufferedImageimage=ImageIO.read(imgStream);g2.drawImage(image,100,100,panel);}catch(Exceptione){System.out.println("Imagem não localizada");}}publicstaticvoidmain(String[]args){newTeste();}}
victorwss
malstryx:
Fiz o que vocês passaram... pq não está aparecendo a imagem?
importjava.awt.*;importjava.awt.image.*;importjavax.swing.*;importjava.io.*;importjavax.imageio.ImageIO;publicclassTesteextendsJComponent{JFrameframe;JPanelpanel;Teste(){frame=newJFrame("Game");panel=newJPanel();panel.setLayout(null);panel.setBackground(Color.WHITE);frame.getContentPane().add(panel);frame.setVisible(true);frame.setSize(800,600);frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);}publicvoidpaintComponent(Graphicsg){try{Graphics2Dg2=(Graphics2D)g;InputStreamimgStream=getClass().getResourceAsStream("jog.PNG");BufferedImageimage=ImageIO.read(imgStream);g2.drawImage(image,100,100,panel);}catch(Exceptione){System.out.println("Imagem não localizada");}}publicstaticvoidmain(String[]args){newTeste();}}
O objeto teste é um componente. Você cria uma JFrame com uma Panel lá. Acontece que o próprio componente que você fez (o Teste) NÃO é acrescentado a tela, e portanto ele não vai ser desenhado lá.
Coloca isso no final do construtor de Teste que resolve:
Fiz o que vocês passaram... pq não está aparecendo a imagem?
importjava.awt.*;importjava.awt.image.*;importjavax.swing.*;importjava.io.*;importjavax.imageio.ImageIO;publicclassTesteextendsJComponent{JFrameframe;JPanelpanel;Teste(){frame=newJFrame("Game");panel=newJPanel();panel.setLayout(null);panel.setBackground(Color.WHITE);frame.getContentPane().add(panel);frame.setVisible(true);frame.setSize(800,600);frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);}publicvoidpaintComponent(Graphicsg){try{Graphics2Dg2=(Graphics2D)g;InputStreamimgStream=getClass().getResourceAsStream("jog.PNG");BufferedImageimage=ImageIO.read(imgStream);g2.drawImage(image,100,100,panel);}catch(Exceptione){System.out.println("Imagem não localizada");}}publicstaticvoidmain(String[]args){newTeste();}}
O objeto teste é um componente. Você cria uma JFrame com uma Panel lá. Acontece que o próprio componente que você fez (o Teste) NÃO é acrescentado a tela, e portanto ele não vai ser desenhado lá.
Coloca isso no final do construtor de Teste que resolve:
Ele poderia apenas sobreescrever o paint do JFrame no lugar do paintComponent, não?
victorwss
Poder, até que poderia. Mas haveria efeitos colaterais ruins: Os subcomponentes do JFrame não seriam desenhados!
renatocustodio
Poder, até que poderia. Mas haveria efeitos colaterais ruins: Os subcomponentes do JFrame não seriam desenhados!
hum entendi… e se chamasse super(g) no início do método, será que não resolveria?
victorwss
Poder, até que poderia. Mas haveria efeitos colaterais ruins: Os subcomponentes do JFrame não seriam desenhados!
hum entendi… e se chamasse super(g) no início do método, será que não resolveria?
Isso traria outro efeito colateral. O desenho seria feito por cima dos subcomponentes e da borda do componentes.
Embora por vezes esse efeito colateral seja desejado, na maioria das vezes ele não é.
S
suspiro10
oi pessoal,
testei os codigos acima, e aqui na minha maquina nao mostrou a imagem…
quem tiver a resposta correta, favor poste ai…