Leia a documentação das classes Image, BufferedImage, Graphics e Graphics2D.
Não funcionou, ele só abre o JFrame e não exibe a imagem.
Eu acho que ele não consegue encontrar o arquivo, não sei se é realmente isso.
Eu salvei o arquivo dentro de um pacote no próprio projeto.
Vou deixar uma print do projeto, é o projeto TrabalhandoImagens, talvez assim possa melhorar a visualizar pra me ajudar.
InputStream stream = getClass().getResourceAsStream("/imagens/Habitante_Zul.png");
Image image = ImageIO.read(stream);
ImageIcon icon= new ImageIcon(image);
vc pode fazer da seguinte forma
ImageIcon imagem = new ImageIcon(“caminho da imagem”);
JLabel imagelabel = new imagelabel();
imagelabel.setIcon(imagem);
Obg, agr foi, uma dúvida, se eu quiser atualizar essa imagem, eu só repetir essas linhas mas com um nome de outra imagem que tenha ali certo?
isso, vc pode fazer da seguinte forma
imagelabel.setIcon(new ImageIcon(“caminho da imagem”));
ou usar somente o objeto ImageIcon
Blz, como eu posso mover essa imagem no Frame? geralmente o label fica sempre no centro do frame
existem vários tipos de gerenciados de janela, mas eu recomento usar sem um pois da um maior controle, fazendo da seguinte forma criando um método construto e nele colocar toda as configurações da janela e os objetos da seguinte forma
public class TrabalhandoImagens extends JFrame implements ActionListener {
ImageIcon imagem = new ImageIcon(“caminho da imagem”);
JLabel imagelabel ;
public TrabalhandoImagens() {
setSize(largura_janela, altura_janela); //aqui se coloca a largura e a altura da janela
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle("titulo janela"); //tituloo da janela
setLocation(100, 0); //a posição da janela no monitor
setLayout(null); //gerenciador de janela nesse caso vai usar nem um
setVisible(true); //deixa o Frame visível
imagelabel = new JLabel(); //inicia o objeto
getContentPane().add(imagelabel); //adiciona o objeto no painel
imagelabel.setBounds(100, 100, 200, 200); //posiciona o objeto os dois primeiros valores são a posição X e Y no Frame e depois a largura e altura do objeto
imagelabel.setIcon(imagem);//muda o icone
}
public static void main(String[] args) {
JFrame janela = new TrabalhandoImagens();
}
cara so usa .add(imagelabel); se vc estiver usando um painel como nesse caso vc esta usando nem um painel recomento usar getContentPane().add(imagelabel);
desculpa @samlis acho que agora entendi vc quer mover a imagem com o mouse é isso ?
não, só mover a imagem a partir das coordenadas dentro do frame
Por exemplo, eu quero colocar a imagem no canto superior direito que seria o ponto (0,0) no Frame. A questão de usar o mouse ou o teclado não tem muito importância, pq eu só quero por enquanto mover a imagem de lugar mesmo, sobre eventos de mouse ou teclado eu já tenho um pouco de noção
É mai ou menos isso aqui, mover a imagem ali pro outro espaço vazio:
O problema persiste, eu só consigo fazer a mudança de posição fazendo isso que eu fiz no código, fora isso ele não muda de posição.
package trabalhandoimagens;
import java.awt.Image;
import java.io.IOException;
import java.io.InputStream;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import java.util.Timer;
import java.util.TimerTask;
public class TrabalhandoImagens {
static Timer timer = new Timer();
static int i = 0;
static int x = 0;
static int y = 0;
public static void main(String[] args) throws IOException {
final Janela janela = new Janela();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
if(i<5){
i++;
janela.moverLabel(x,y);
x += 10;
y -= 10;
} else {
timer.cancel();
System.out.println("Acabou");
}
}
}, 100, 1000);
}
}
final class Janela extends JFrame {
InputStream stream = getClass().getResourceAsStream("/imagens/Habitante_Zul.png");
Image image;
ImageIcon imagem;
JLabel imagelabel;
public Janela() throws IOException {
this.image = ImageIO.read(stream);
imagem = new ImageIcon(image);
imagelabel = new JLabel();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(600,600);
setVisible(true);
this.getContentPane().add(imagelabel);
imagelabel.setLayout(null);
imagelabel.setIcon(imagem);
}
public void moverLabel(int x, int y) {
imagelabel.setBounds(x,y,imagelabel.getWidth(),imagelabel.getHeight());
}
vc pode chamar esse método qual sua imagem for clicada, ele pega a posição X e Y do seu curso do mouse adiciona a posição da imagem meno o seu tamanho dividido por dois
private void imagelabelMouseDragged(java.awt.event.MouseEvent evt) {
imagelabel.setLocation(evt.getX() + imagelabel.getLocation().x - imagelabel.getWidth() / 2, evt.getY() + imagelabel.getLocation().y - imagelabel.getHeight() / 2);
}
vc esta fazendo um jogo? pq se estiver vc pode criar um repositório no GitHub e passar o link por aqui, eu ajudo
Então eu só consigo mexer uma imagem ou definir a posição dela através de Eventos como por exemplo mouse e teclado?
E na verdade eu to querendo aprender o máximo que eu poder sobre Java, antes de tentar criar um jogo. Isso que to fazendo é só pra aprender mesmo.
Não, você pode alterar de acordo com qualquer parâmetro que quiser (ex: de x em x segundos, ou quando um determinado estado interno do seu programa mudar).
O método setLocation(), por exemplo, precisa de 2 parâmetros: posição X e posição Y. Pra ele, não importa de onde vieram esses valores (do mouse, teclado, rede, temperatura do processador, um timer, distância da Terra até a Lua…). O setIcon() precisa de um ImageIcon, mas de onde vem esse ImageIcon não importa para ele. Isso é uma das mágicas do encapsulamento
.
Dica: se quer criar um jogo razoavelmente dinâmico, os componentes Swing não são adequados. Geralmente, em jogos, se desenha diretamente sobre um canvas (ex: sobrescrevendo o método paintComponent de um JPanel). Você estará melhor servido usando uma biblioteca/engine como a LibGdx, mas não recomendo até você estar mais confortável com Java.
Abraço.
Sim, eu entendo, o que quis dizer é que por exemplo, quando eu uso o setBounds ou setLocation ou qualquer outro metódo desses direto no main ou qualque outro lugar que não seja um evento, timertask a imagem não, ele fica sempre localizada numa posicao centralizada na tela no caso no lado esquerdo, então por exemplo, eu vo programar ele e só tem o Jframe e o JLabel com a imagem e eu use o setLocation direto no main, uma linha só com jLabelImagem.setLocation(100,100), ele simplesmente não vai executar o método, eu preciso colocar esse método dentro de um timer, ou um evento para ai sim ser chamado e executado.
Depende de como você está fazendo isso. Você está usando a thread do Swing ao criar seu JFrame?
Mas esse é o tipo de problema que você pode ter ao tentar usar o Swing dessa maneira, setando a posição absoluta dos componentes. Lembrando também que o Swing não é thread safe, então se você usar timers ou threads para controlar os elementos na tela, pode ter esse e outros problemas.
Abraço.




