Adicionando Imagem de Fundo usando JFrame

Olá pessoal. Sou estudante de curso técnico e iniciante aqui no fórum e tenho um pequeno trabalho pra entregar para o Professor de JAVA e ele pediu que implementassemos uma imagem de fundo aos programas que estavamos desenvolvendo (Programas que foram desenvolvidos de acordo com exercícios passados pelo professor) e ainda não consegui adicionar a imagem ao meu programa, já pesquisei diversos tópicos sobre o assunto e ainda não consegui utilizar as soluções encontradas neles, se puderem me ajudar agradeço e muito, segue o código para que vocês possam ver.

[code]
import java.awt.*;

import javax.swing.*;
import javax.swing.border.EmptyBorder;

public class Floricultura4 extends JFrame{

public Floricultura4(){
		super("Gerenciador de Floricultura");
			

		GridBagLayout layout = new GridBagLayout();
		GridBagConstraints x = new GridBagConstraints();
		((JComponent)getContentPane()).setBorder(new EmptyBorder(5,8,8,8 ));
		x.insets = new Insets(5,5,5,5);
		getContentPane().setLayout(layout);
		
		JLabel labelS = new JLabel("FLORICULTURA ETEC");
		JLabel label1 = new JLabel("CAIXA");
		JLabel label2= new JLabel("Cliente:");
		JLabel label3= new JLabel("Total da Compra:");
		JLabel label4= new JLabel("Produto(s):");
		JTextField texto1 = new JTextField(20);
		JTextField texto2 = new JTextField(20);
		JTextField texto3 = new JTextField(20);
		JButton botao1= new JButton("LIMPAR");
		JButton botao2= new JButton("FINALIZAR COMPRA");
		
		
		
		
		
		
		x.gridy=0;
		x.gridx=0;
		x.gridwidth=10;
		x.anchor= GridBagConstraints.CENTER;
		layout.setConstraints(labelS, x);
		getContentPane().add(labelS);
		
		
		x.gridy=1;
		x.gridx=0;
		x.gridwidth=10;
		x.anchor=GridBagConstraints.CENTER;
		layout.setConstraints(label1, x);
		getContentPane().add(label1);
		
		x.gridy=2;
		x.gridx=0;
		x.gridwidth=1;
		layout.setConstraints(label2, x);
		getContentPane().add(label2);
		
		x.gridy=2;
		x.gridx=1;
		layout.setConstraints(texto1, x);
		getContentPane().add(texto1);
		
		x.gridy=4;
		x.gridx=0;
		layout.setConstraints(label3, x);
		getContentPane().add(label3);
		
		x.gridy=4;
		x.gridx=1;
		layout.setConstraints(texto2, x);
		getContentPane().add(texto2);
		
		x.gridy=7;
		x.gridx=0;
		layout.setConstraints(label4, x);
		getContentPane().add(label4);
		
		x.gridy=7;
		x.gridx=1;
		layout.setConstraints(texto3, x);
		getContentPane().add(texto3);
		
					
		x.gridy=12;
		x.gridx=1;
		x.anchor=GridBagConstraints.EAST;
		layout.setConstraints(botao1, x);
		getContentPane().add(botao1);
		
		
		x.gridy=12;
		x.gridx=3;
		x.anchor=GridBagConstraints.WEST;
		layout.setConstraints(botao2, x);
		getContentPane().add(botao2);

	
		
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		pack();
		setVisible(true);
		setLocationRelativeTo(null);
		
		
}



public static void main (String args[]){

	new Floricultura4();
	
}


	
}

[/code]

Bem vindo!
Quando for inserir código, utilize a tag CODE.

Para adicionar um background (imagem de fundo) ao seu programa, você pode inserir essa classe no seu projeto:

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.JPanel;

public class Background extends JPanel{

 private String pathImage = ""; // variável que vai receber o caminho da imagem

 public Background() {
     
 }
 

 public Background(String pathImage) {
     this.pathImage = pathImage;
 }

  // o método abaixo sobreescreve o método de: javax.swing.JComponent

 @Override
 // "Graphics" é a classe base abstrata para todos os contextos de
 // gráficos que permitem um aplicativo desenhar sobre os componentes.
 public void paintComponent(Graphics g) {

     // A classe Graphics2D estende a Graphics para fornecer um controle
     // mais sofisticado sobre a geometria, transformação de coordenadas
     // e gerenciamento de cores e layout de textos e imagens.
     Graphics2D gr = ( Graphics2D )g.create();

     try {

        // O BufferedImage é uma subclasse Image que representa uma
        // imagem carregada na memória.
        // Ela permite que a imagem seja manipulada.

        // A Imagem é carregada através da classe ImageIO

        BufferedImage buffer = ImageIO.read( new File(pathImage) );
        gr.drawImage(buffer, null, 0, 0 ); // desenha a imagem

     } catch (IOException ex) {
        Logger.getLogger(Background.class.getName()).log(Level.SEVERE, null, ex);
     }

 }
}

E no form em que deseja inserir a imagem:


//O construtor recebe como parâmetro o caminho para a imagem. Neste caso, "a.jpg"
Background background = new Background("a.jpg");
        background.setSize(2000, 2000);
        getContentPane().add(background);