Adicionar JPanel no JFrame

9 respostas
G

Bom dia pessoal.

Estou com o seguinte problema:

Tenho uma classe com o método Desenhar:

public class DesenhaImagem extends JPanel{
    
    public void Desenhar(Graphics g)
    {
        super.paintComponent(g);
        
        this.setBackground(Color.WHITE);
        
        Image tabuleiro = Toolkit.getDefaultToolkit().getImage("/home/gabriel/Documentos/APS/Tabuleiro.png");  
        
        g.drawImage(tabuleiro, 330, 50, this);
        
    }
Agora quero adicionar essa classe na minha classe principal (JFrame), estou fazendo da seguinte maneira:
DesenhaImagem imagem = new DesenhaImagem();
add(imagem);

Porem não está dando certo, quando eu crio o frame manualmente da certo, mas quando adiciono um JFrame ao projeto e tento adicionar DesenhaImagem não aparece nada.

Gostaria de saber se a lógica está correta ou o que estou tentando está errado.

Obrigado.

9 Respostas

Z

Você quer um JPanel com imagem de fundo?

V

Seu método desenhar tem que, obrigatoriamente, chamar-se paintComponent.

G

Entendi, vou mudar o nome. Obrigado.

Na verdade gostaria de posicionar o JPanel em uma área determinada do JFrame.

Z

Eu usso essa classe.

package Paineis;

import java.awt.Graphics;
import java.awt.Image;

import javax.swing.JPanel;

@SuppressWarnings("serial")
public class PainelIagem extends JPanel {

	private Image fundo;

	public PainelIagem(Image image) {
		this.fundo = image;
	}

	@Override
	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		int centerX = (getWidth() - fundo.getWidth(null)) / 2;
		int centerY = (getHeight() - fundo.getHeight(null)) / 2;
		g.drawImage(fundo, centerX, centerY, null);
	}
}

Se você for exportar o projeto, então precisa importar a imagem para o projeto e fazer a seguinte chamada.

JPanel = new PainelIagem(ImageIO.read(getClass().getResourceAsStream("/imagens/Fundo21.jpg")));
//Esse método lança um exceção, você trata ou joga pra fora.

Para não ter o problema que eu tive. É importante lembrar a terminação do arquivo tem que ser igual a original. Ser for em minusculo faça em minusculo, se for em maiúsculo faça em maiúsculo, tipo .JPEG e .jpg
Se não fizer conforme está o arquivo, as imagens não aparecerão, nem se quer é lançada a exceção.

Abraço!

Z
Gabriel_Louren?:
Entendi, vou mudar o nome. Obrigado.

Na verdade gostaria de posicionar o JPanel em uma área determinada do JFrame.

Dê uma lida sobre os layouts, é facio de usar. Eles são responsáveis por organizar os componentes, tanto nos JFrames, quanto nos JPanel.

edit:

Em alguns momentos, será necessario vc usar mais de um JPanel para organizar um único JPanel em determinada aria.
Exemplo.

Se que quero colocar, um JPanel no cato superior direito do meu Frame, terei que fazer assim.

JFrame f = new JFrame();
f.setLayout(new BorderLayout()); //organiza os componente em 4 regieos, respectivamente: Norte, Sul, Leste e Oeste.

JPanel p = new JPanel();
p.setLayout(new BorderLayout());

f.add(BorderLayout.SOUTH, p); //Adiciono o painel p na parte sul, (superior do frame);

JPanel p1 = new JPanel();
p.add(BorderLayout.EAST, p1); // Adiciono ao leste do painel p, e assim terei os componente que forem adicionados em p1, exatamente no canto superior direito do frame.

Abraço!

G

Valeu.

Em relação ao posicionamento quero fazer o seguinte:

Adicionar o panel contendo uma imagem que seria o tabulerio, dentro de um jframe.

E dentro do jframe adicionar outros objetos, por exemplo, botões, label, outro jpanel.

Z

Então, adiciona um JPanel ao frame, e ai as outras coisas vc adiciona no JPanel.
novos, JPanel, botoes e assim vai…

G

Então, adiciona um JPanel ao frame, e ai as outras coisas vc adiciona no JPanel.
novos, JPanel, botoes e assim vai…

Surgiram 2 dúvidas:

  • Essa linha pode estar dentro do construtor ?
  • E porque quando eu crio o frame manualmente eu consigo adicionar o panel com a imagem e funciona perfeitamente, mas quando utilizo a paleta, arrastando os componentes não consigo visualizar a imagem, terei que criar tudo na mão ?

Valeu.

E

-Sim, pode, mas não esqueça de tratar as exceções. Além disso, você pode até criar e adcionar seu componente ai, mas só vai poder mostrar o jframe depois que o construtor terminar de ser executado.

-Provavelmente, sim, pois você está criando componentes customizados, que não se comportam da mesma forma que os compoenntes comuns da paleta. Provavelmente existe formas de adicionar seus componenetes na paleta, ams acho que nem compensa pelo trabalho que vai dar.

Criado 3 de novembro de 2012
Ultima resposta 4 de nov. de 2012
Respostas 9
Participantes 4