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???
void desenhar(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
Image image = new ImageIcon("jog.PNG").getImage();
g2.drawImage(image,100,100, frame);
}
abçs
Agora que voce está usando o Graphics2D não use o ImageIcon.
Faça algo asism:
void desenhar(Graphics g) {
Graphics2D g2 = (Graphics2D) g.create();
ImputStream imgStream = this.class.getResourceAsStream("jog.PNG");
BufferedImage image = ImageIO.read(imgStream);
g2.drawImage(image,100,100, frame);
}
O método read da ImageIO aceita um File ou um ImputStream ou uma URL como parametro para carregar a imagem.
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.
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:
public void desenhar(Graphics g) {
try {
Graphics2D g2 = (Graphics2D) g;
File img = new File("jog.png");
BufferedImage image = ImageIO.read(img);
g2.drawImage(image, 50, 100, frame);
}
catch(Exception e) {
System.out.println("erro");
}
}
[quote=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:
public void desenhar(Graphics g) {
try {
Graphics2D g2 = (Graphics2D) g;
File img = new File("jog.png");
BufferedImage image = ImageIO.read(img);
g2.drawImage(image, 50, 100, frame);
}
catch(Exception e) {
System.out.println("erro");
}
}
[/quote]
Sobrescreva o método paintComponent. Esse método é chamado pelo AWT para renderizar os componentes.
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
public void paintComponent(Graphics g){
Graphics2D g2d = (Graphics2D) g.create();//cria
//Trabalha com o g2d (Pinta, coloca imagens, etc..)
g2d.dispose();//libera
}
Fiz o que vocês passaram… pq não está aparecendo a imagem?
import java.awt.*;
import java.awt.image.*;
import javax.swing.*;
import java.io.*;
import javax.imageio.ImageIO;
public class Teste extends JComponent {
JFrame frame;
JPanel panel;
Teste() {
frame = new JFrame("Game");
panel = new JPanel();
panel.setLayout(null);
panel.setBackground(Color.WHITE);
frame.getContentPane().add(panel);
frame.setVisible(true);
frame.setSize(800,600);
frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
}
public void paintComponent(Graphics g) {
try {
Graphics2D g2 = (Graphics2D) g;
InputStream imgStream = getClass().getResourceAsStream("jog.PNG");
BufferedImage image = ImageIO.read(imgStream);
g2.drawImage(image, 100, 100, panel);
}
catch(Exception e) {
System.out.println("Imagem não localizada");
}
}
public static void main(String[] args) {
new Teste();
}
}
[quote=malstryx]Fiz o que vocês passaram… pq não está aparecendo a imagem?
[code]
import java.awt.;
import java.awt.image.;
import javax.swing.;
import java.io.;
import javax.imageio.ImageIO;
public class Teste extends JComponent {
JFrame frame;
JPanel panel;
Teste() {
frame = new JFrame("Game");
panel = new JPanel();
panel.setLayout(null);
panel.setBackground(Color.WHITE);
frame.getContentPane().add(panel);
frame.setVisible(true);
frame.setSize(800,600);
frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
}
public void paintComponent(Graphics g) {
try {
Graphics2D g2 = (Graphics2D) g;
InputStream imgStream = getClass().getResourceAsStream("jog.PNG");
BufferedImage image = ImageIO.read(imgStream);
g2.drawImage(image, 100, 100, panel);
}
catch(Exception e) {
System.out.println("Imagem não localizada");
}
}
public static void main(String[] args) {
new Teste();
}
}
[/code][/quote]
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:
panel.add(this);
this.setBounds(50, 50, 100, 100);
[quote=victorwss][quote=malstryx]Fiz o que vocês passaram… pq não está aparecendo a imagem?
[code]
import java.awt.;
import java.awt.image.;
import javax.swing.;
import java.io.;
import javax.imageio.ImageIO;
public class Teste extends JComponent {
JFrame frame;
JPanel panel;
Teste() {
frame = new JFrame("Game");
panel = new JPanel();
panel.setLayout(null);
panel.setBackground(Color.WHITE);
frame.getContentPane().add(panel);
frame.setVisible(true);
frame.setSize(800,600);
frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
}
public void paintComponent(Graphics g) {
try {
Graphics2D g2 = (Graphics2D) g;
InputStream imgStream = getClass().getResourceAsStream("jog.PNG");
BufferedImage image = ImageIO.read(imgStream);
g2.drawImage(image, 100, 100, panel);
}
catch(Exception e) {
System.out.println("Imagem não localizada");
}
}
public static void main(String[] args) {
new Teste();
}
}
[/code][/quote]
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:
panel.add(this);
this.setBounds(50, 50, 100, 100);
[/quote]
Agora sim , vlw mesmo victor.
Ele poderia apenas sobreescrever o paint do JFrame no lugar do paintComponent, não?
Poder, até que poderia. Mas haveria efeitos colaterais ruins: Os subcomponentes do JFrame não seriam desenhados!
Poder, até que poderia. Mas haveria efeitos colaterais ruins: Os subcomponentes do JFrame não seriam desenhados![/quote]
hum entendi… e se chamasse super(g) no início do método, será que não resolveria?
Poder, até que poderia. Mas haveria efeitos colaterais ruins: Os subcomponentes do JFrame não seriam desenhados![/quote]
hum entendi… e se chamasse super(g) no início do método, será que não resolveria?[/quote]
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 é.
oi pessoal,
testei os codigos acima, e aqui na minha maquina nao mostrou a imagem…
quem tiver a resposta correta, favor poste ai…
package testes;
import java.awt.*;
import java.awt.image.*;
import javax.swing.*;
import java.io.*;
import javax.imageio.ImageIO;
public class imageTeste extends JComponent {
JFrame frame;
JPanel panel;
imageTeste() {
frame = new JFrame("Game");
panel = new JPanel();
panel.setLayout(null);
panel.setBackground(Color.WHITE);
// nao funcionou...
panel.add(this);
this.setBounds(50, 50, 100, 100);
frame.getContentPane().add(panel);
frame.setVisible(true);
frame.setSize(800,600);
frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
// tambem nao funcionou
// this.setBounds(50, 50, 100, 100);
// panel.setBackground(Color.WHITE);
}
public void paintComponent(Graphics g) {
try {
Graphics2D g2 = (Graphics2D) g;
InputStream imgStream = getClass().getResourceAsStream("imagens/teste.png");
BufferedImage image = ImageIO.read(imgStream);
g2.drawImage(image, 100, 100, panel);
System.out.println("Mostrando imagem");
}
catch(Exception e) {
System.out.println("Imagem não localizada");
}
}
public static void main(String[] args) {
new imageTeste();
}
}