Colocar imagem como plano de fundo em JFrame

8 respostas
Thiago_de_Paula_Bese

Olá Pessoal.

É o seguinte amigos, desenvolvi uma telinha básica aqui, porem não sei como inserir um plano de fundo (imagem) na parte cinza da tela. Só pra completar essa imagem eu queria sobre toda a parte cinza da tela. Pra ficar mais facil, postarei o seguinte código pra facilitar os amigos.

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;


public class JanelaPrincipal extends JFrame implements ActionListener{

    private JMenuBar menubar1;
    private JMenu arquivo, cadastro;
    private JMenuItem sair, clientes;
    
    public JanelaPrincipal(){
        setLayout(null);
        setTitle("Sistema de Cadastro 1.0");
        setBounds(250, 100, 800, 600);
        menubar1 = new JMenuBar();
        arquivo = new JMenu("Arquivo");
        sair = new JMenuItem("Sair");
        sair.addActionListener(this);
        arquivo.add(sair);
        menubar1.add(arquivo);
        cadastro = new JMenu("Cadastro");
        clientes = new JMenuItem("Clientes");
        clientes.addActionListener(this);
        cadastro.add(clientes);
        menubar1.add(cadastro);
        setJMenuBar(menubar1);
    }

    public void actionPerformed(ActionEvent e) {
        if(e.getSource() == sair)
            System.exit(0);
    }

}

Classe principal

import javax.swing.JFrame;

public class Principal{
    public static void main(String[] args){
        JFrame janela = new JanelaPrincipal();
        janela.setVisible(true);
        janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    
}

Se possível, queria a ajuda dos amigos, com um exemplo de implementação para essa minha duvida. XD

Desde já agradeço

8 Respostas

M

Um exemplo:

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;

public class JanelaPrincipal extends JFrame implements ActionListener {

	private static final long serialVersionUID = 1L;
	private JMenuBar menubar1;
	private JMenu arquivo, cadastro;
	private JMenuItem sair, clientes;

	public JanelaPrincipal() {
		setTitle("Sistema de Cadastro 1.0");
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		menubar1 = new JMenuBar();
		arquivo = new JMenu("Arquivo");
		sair = new JMenuItem("Sair");
		sair.addActionListener(this);
		arquivo.add(sair);
		menubar1.add(arquivo);
		cadastro = new JMenu("Cadastro");
		clientes = new JMenuItem("Clientes");
		clientes.addActionListener(this);
		cadastro.add(clientes);
		menubar1.add(cadastro);
		setJMenuBar(menubar1);
		ajustaFundo("images/fundo.png");
		add(new JButton("Botão 1"));
		add(new JLabel("Label 1"));
		setSize(550, 500);
		setLocationRelativeTo(null);
	}

	public void actionPerformed(ActionEvent e) {
		if (e.getSource() == sair)
			dispose();
	}

	public void ajustaFundo(String arquivo) {
		JLabel fundo = new JLabel(new ImageIcon(arquivo));
		fundo.setLayout(new FlowLayout());
		setContentPane(fundo);
	}

}

Dica: evite usar null layout. Invista um tempo estudando sobre gerenciadores pois vale muito o esforço.

Dica 2: evite usar System.exit() e EXIT_ON_CLOSE pois isso mata a JVM inteira, interrompendo processos que ainda podem estar executando alguma tarefa importante.

Thiago_de_Paula_Bese

Obrigado pela dica amigo. Vou estudar seu exemplo.

Obrigado xD

Thiago_de_Paula_Bese

marcobiscaro2112:
Um exemplo:

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;

public class JanelaPrincipal extends JFrame implements ActionListener {

	private static final long serialVersionUID = 1L;
	private JMenuBar menubar1;
	private JMenu arquivo, cadastro;
	private JMenuItem sair, clientes;

	public JanelaPrincipal() {
		setTitle("Sistema de Cadastro 1.0");
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		menubar1 = new JMenuBar();
		arquivo = new JMenu("Arquivo");
		sair = new JMenuItem("Sair");
		sair.addActionListener(this);
		arquivo.add(sair);
		menubar1.add(arquivo);
		cadastro = new JMenu("Cadastro");
		clientes = new JMenuItem("Clientes");
		clientes.addActionListener(this);
		cadastro.add(clientes);
		menubar1.add(cadastro);
		setJMenuBar(menubar1);
		ajustaFundo("images/fundo.png");
		add(new JButton("Botão 1"));
		add(new JLabel("Label 1"));
		setSize(550, 500);
		setLocationRelativeTo(null);
	}

	public void actionPerformed(ActionEvent e) {
		if (e.getSource() == sair)
			dispose();
	}

	public void ajustaFundo(String arquivo) {
		JLabel fundo = new JLabel(new ImageIcon(arquivo));
		fundo.setLayout(new FlowLayout());
		setContentPane(fundo);
	}

}

Dica: evite usar null layout. Invista um tempo estudando sobre gerenciadores pois vale muito o esforço.

Dica 2: evite usar System.exit() e EXIT_ON_CLOSE pois isso mata a JVM inteira, interrompendo processos que ainda podem estar executando alguma tarefa importante.

Cara, não consegui entender essa variável estatica

private static final long serialVersionUID = 1L;

você poderia me ajudar?

Agradeço.

E

Cara isso e uma variavel que e usada em serializaçao !!

ela fala e versao atual de sua classe .

Thiago_de_Paula_Bese

erato690:
Cara isso e uma variavel que e usada em serializaçao !!

ela fala e versao atual de sua classe .

Desculpa a inocencia cara, mas ela é obrigatória na implementação, no caso acima?

E

nao !!!

a nao ser que voçe deseja usar serializaçao em sua classe mas caso nao!!!

da uma lida amigo para ver como ela funciona creio que vai te ajudar muito!!!

Thiago_de_Paula_Bese

Obrigado.

M

Só complementando: não é obrigatório, mas se você não usar o compilador gerará um warning pois a superclasse (JFrame) implementa Serializable e define um serialVersionUID e a subclasse (a sua classe) não. Eu costumo usar mas, como já dito, não é obrigatório a menos que você vá serializar sua classe.

Criado 3 de fevereiro de 2010
Ultima resposta 3 de fev. de 2010
Respostas 8
Participantes 3