Duvida com jFrame

10 respostas
wampactimus

Boa dia

tenho uma duvida, eu coloquei um jlabel no meu jFrame, e atraves da propriedade icon, coloquei uma imagem no jFrame, eis minha duvida, eu queria fazer dessa imagem um plano de fundo no jFrame e colocar por cima dessa imagem os botões e etc, mas não consigo, quando eu coloco um botão, por exemplo, ele não fica em cima da imagem, mas do lado

como faço nessa caso…
aguardo respostas

grato

10 Respostas

L

wampactimus já fiz um negocio desse genero…

o JFrame possui um atributo Container

algo do tipo

frame.setContentPane();

O que você tem que fazer, é criar seu proprio Container

e sobrescrever o metodo paint do seu Container e desenhando a imagem que você qué

algo do tipo

class MeuContainer extends Container{

public MeuContainer(){
}

@Override
	public void paint(Graphics arg0) {
		super.paint(arg0);
                g.drawImage(); //<< usa isto passa a imagem
	}

}

e depois fica algo do tipo

setContentPane(new MeuContainer()); // esse codigo no construtor do seu JFrame

O caminho é por ai… resumidamente.

espero ter ajudado… abraço

ViniGodoy

O label não é um container. Nesse caso, você deverá usar um painel, como o JImagePanel, do projeto Towel:
http://code.google.com/p/towel/

ViniGodoy

O código do looljunior tem diversos erros:

  1. Você deve sobrescrever o método paintComponent, não o método paint;
  2. Você deve fazer um filho da classe JComponent. Se for um container, da classe JPanel. A classe Container é da AWT, não do Swing;
  3. A assinatura do método drawImage está errada, pois falta o parâmetro (a imagem, por exemplo);

Use a classe do Towel. Ela não só faz o que você quer, como dá opções interessantes caso a imagem seja se um tamanho diferente do painel. Ela permite colocar lado-a-lado, centralizado ou esticar a imagem.

L

ViniGodoy, ter outras maneiras de se fazer é diferente do que estar errado…

segue um exemplo

Main
public class Main {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Tela tela = new Tela();
		tela.setVisible(true);
	}

}

Classe com o JFrame

import java.awt.Dimension;

import javax.swing.JFrame;


public class Tela extends JFrame{
	
	
	public Tela(){
		setContentPane(new MeuContainer());
		setSize(new Dimension(800,600));
		setDefaultCloseOperation(EXIT_ON_CLOSE);
	}
}

O Container no qual eu citei…

import java.awt.Container;
import java.awt.Graphics;

import javax.swing.ImageIcon;


public class MeuContainer extends Container{
	
	public MeuContainer(){
		
	}
	
	@Override
	public void paint(Graphics g) {
                g.drawImage(new ImageIcon("C:\imagem.png").getImage(), 0, 0, null);
		super.paint(g);
	}

}

Neste caso, o JFrame possui uma imagem de fundo, e se o cara querer ele pode usar assim, basta ele coloca o jpanel na frente como opaque(false)
e irá chegar no resultado esperado…

se este código que eu coloquei acima, não funcionar… ai irei concordar com vc…

diga que existe outra maneira melhor, ou mais adequada, agora dizer que está errado ou que não funcionar ou sei lah o que… nao eh o certo…

abraço

ViniGodoy

Não cara, dessa vez significa estar errado sim. Veja o documento:
http://java.sun.com/products/jfc/tsc/articles/painting/#callbacks

Onde diz:
Swing programs should override paintComponent() instead of overriding paint().

Outra coisa, sobre misturar AWT e Swing:
http://java.sun.com/products/jfc/tsc/articles/mixing/

Onde diz:
However, because there are significant advantages to using lightweight components, we recommend using lightweights (and Swing!) wherever possible and only using
heavyweight components where a lightweight version either isn’t yet available or doesn’t meet your program’s needs.

Existem muitos problemas que podem ser causados por não seguir as recomendações do Swing. Você deve ler atentamente a documentação e programar nelas. No seu caso, você está misturando componentes heavy-weight com lightweight, e também está sobrescrevendo o método errado de pintura. Isso irá prejudicar caso você queira usar o double-buffering, bordas, ou outros recursos mais sofisticados do Swing. Isso também poderá prejudicar e até mesmo impedir a portabilidade da sua aplicação, o que é um bug disfarçado e cruel.

“Fazer funcionar” não é sinônimo de “fazer da maneira correta” ou “fazer sem problemas”. Muitas vezes (para não dizer, na maior parte das vezes), um código que aparentemente funciona, ou funciona em uma situação específica é mais nocivo que um que não funciona de jeito nenhum.

L

Hmmm… É confeço que eu não sabia disso, achei que não teria problema em fazer daquela forma.

Bom, com isso aprendi mais uma coisa… =D

O negocio funciona, porem não é de boa pratica e pode causar problemas futuros. =S

Gostei das “citações”, hehehe

flw aew…

desculpa por qualquer coisa, realmente achei que não teria “pobrema” rsrs

abraço

ViniGodoy

Tranquilo. Esses são mesmo os erros clássicos para quem começa a produzir seus próprios componentes Swing. Eu mesmo aprendi essas coisas errando, e procurando as causas.

Os docs que citei acima citam um pouco dos problemas de se fazer errado. E explicam o pq o Swing recomenda fazer desse jeito.

wampactimus

ViniGodoy

me desculpe, mas eu não estou entendo muito bem como colocar a imagem de fundo no jFrame´

poderia colocar um código aqui para eu entender?

grato

wampactimus

looljunior

valeu pela juda, eu sou novato em java, o semestre de java acabou e eu estou aprendendo sozinho agora,

no proximo semestre não vai ter java e vou ter que me virar pra aprender

conto com a ajuda do GUJ

:slight_smile:

ViniGodoy

Você está construindo seu JFrame pelo construtor automático do Netbeans, ou está fazendo isso no braço, via código?

Criado 20 de dezembro de 2010
Ultima resposta 20 de dez. de 2010
Respostas 10
Participantes 3