Sortear vários números sem repetição

Olá pessoal, boa tarde!

Estou com um pequeno problema.

Sou iniciante em java e estou tentado fazer, somente para estudo, um aplicativo desktop que sorteia números, tipo os resultados da loteria, etc, ou seja, não podem se repetir.

Eu tentei sortear os números em um array e depois ir passando para outro array onde iria sendo feita a comparação até eu obter o determinado número de números sorteados desejado.

Bom, no sistema o usuário informa a quantidade de números a serem sorteados, números de jogos/vezes e valor máximo sorteado.

Vou postar aqui o código. Do jeito que esta atualmente funciona normalmente, porém repetindo os números sorteados. Na tentativa de refazer o código fazendo o mesmo funcionar eu removi o meu código com erro e salvei, pois era código de ontem, estava muito sujo e não entendi nada hoje do que tentei rss, por isso não tem neste código a maneira como eu estava tentando, mas eu tentei de várias maneiras, umas se não me engano encontrei aqui no forum, mas não consegui fazer funcionar.

Bom, gostaria também de uma ajuda com o ícone da janela, eu fiz certinho como aprendi, faço o exemplo no notepad, sem usar package e consigo mudar o ícone, no notepad usando package já não consigo mais mudar, é o mesmo no netbeans, não consigo mudar o ícone, alguém poderia me dizer o porque e qual a solução? No código que estou postando tem a maneira a qual estou fazendo.

Aqui vai o código todo do sistema, uma única classe. Se alguém por favor puder me explicar que parte do código eu devo mudar e o que deve ser feito, eu ficarei muito grato. Não precisa ser mastigado, somente explicar e se possível dar um exemplo.

Peço desculpa se o código tiver um pouco bagunçado. O projeto foi feito usando netbeans, porém não usei a opção para criar aplicativos desktop de maneira mastigada, pois meu objetivo é fixar o máximo possível o que venho aprendendo.

Segue o código:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package init;

//classes importadas
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.text.ParseException;
import javax.swing.text.MaskFormatter;
import java.util.Random;

/**
 *
 * @author Administrador
 */

//classe Bicho
public class Bicho extends JFrame {

    //cria JLabel
    JLabel lbQntNumeros, lbQntJogos, lbNumMax, lbNumSorteados;
    //cria campo para diigitar nome do usuário
    JFormattedTextField edQntNumeros, edQntJogos, edNumMax;
    MaskFormatter msQntNumeros, msQntJogos, msNumMax;
    //cria botões
    JButton btSortear;
    //Cria listas
    JList lNumSorteados;

    //array que armazena os valores de cada jogo
    int jogo[] = new int[99];

    //array que armazena todos os jogos
    String listaJogos[] = new String[9999];

    //construtor da classe
    public Bicho() {

        //titulo da janela
        super("Sorteia números");

        ImageIcon icone = new ImageIcon("imagem.jpg");
        setIconImage(icone.getImage());

        for(int i = 0; i < listaJogos.length; ++i)
            listaJogos[i] = "Jogo " + String.valueOf(1+i) + ": ";

        //configura a quantidade de colunas e linhas
        setLayout(null);

        //cor do formulario
        Container fundo = getContentPane();
        //fundo.setBackground(Color.red);

        /** Inicializa os JLabel */
            lbQntNumeros = new JLabel("Quantidade de números");
            lbQntJogos = new JLabel("Quantidade de jogos");
            lbNumMax = new JLabel("Número de 1 até...");
            lbNumSorteados = new JLabel("Números sorteados");
        /** fim JLabel */

        /** Inicializa os JList */
            lNumSorteados = new JList(listaJogos);
            lNumSorteados.setVisibleRowCount(5);
            JScrollPane barraRolagem = new JScrollPane(lNumSorteados);
            lNumSorteados.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        /** fim JList */

        /** Inicializa Mascaras */
            try {

                msQntNumeros = new MaskFormatter("##");
                msQntJogos = new MaskFormatter("####");
                msNumMax = new MaskFormatter("##");

            }
            catch(ParseException excp) {}
        /** Fim Mascaras */

        /** Inicializa JFormattedTextField */
            edQntNumeros = new JFormattedTextField(msQntNumeros);
            edQntJogos = new JFormattedTextField(msQntJogos);
            edNumMax = new JFormattedTextField(msNumMax);
        /** fim JTextField e JPasswordField */

        /** inicializa os JButton */
            btSortear = new JButton("Sortear");
        /** fim JButton */

        /** Posiciona os componentes */
            //JLabel
            lbQntNumeros.setBounds(20, 20, 300, 20);
            lbQntJogos.setBounds(20, 70, 300, 20);
            lbNumMax.setBounds(20, 120, 300, 20);
            lbNumSorteados.setBounds(200, 20, 300, 20);

            //JFormattedTextField
            edQntNumeros.setBounds(20, 40, 150, 20);
            edQntJogos.setBounds(20, 90, 150, 20);
            edNumMax.setBounds(20, 140, 150, 20);

            //JButton
            btSortear.setBounds(225, 190, 150, 20);

            //JList
            barraRolagem.setBounds(200, 40, 370, 120);
        /** fim da posição dos componentes */

        //botão padrão ao apertar ENTER
        getRootPane().setDefaultButton(btSortear);

        /** Ação JButton */
            btSortear.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    sorteador();
                    lNumSorteados.repaint();
                }
            });
        /** fim Ação JButton */

        /** insere os componentes no formulário */
            //JLabel
            add(lbQntNumeros);
            add(lbQntJogos);
            add(lbNumMax);
            add(lbNumSorteados);

            //JTextField
            add(edQntNumeros);
            add(edQntJogos);
            add(edNumMax);

            //JButton
            add(btSortear);

            //JList
            add(barraRolagem);
        /** fim da inserção de componentes */

        //tamanho do formulário
        setSize(600, 250);

        //torna o formulário visível
        setVisible(true);

        //não permite redimencionamento do formulário
        setResizable(false);

        //mostra o furmulário sempre no centro da tela
        setLocationRelativeTo(null);

    } //fim do construtor

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here

        Bicho app = new Bicho();

        app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    } //fim do método main

    public void sorteador() {

        //cria objeto Random e atribui a numeroAleatorio
        Random numeroAleatorio = new Random();

        //String para armazenar os resultados do array jogo acumulado
        String jogoFinal = "";

        //cria Strings e atribui os valores dos JFormattedTextField
        String qntNumeros = edQntNumeros.getText();
        String qntJogos = edQntJogos.getText();
        String numMax = edNumMax.getText();

        //cria integers para armazenar os valores em inteiros
        int numeros = 0;
        int jogos = 0;
        int max = 0;

        //verifica se todos os JFormattedTextField foram preenchidos, se não exibe uma mensagem
        if (!qntNumeros.trim().equals("") &&
                !qntJogos.trim().equals("") &&
                    !numMax.trim().equals("")) {

            numeros = Integer.parseInt(qntNumeros);
            jogos = Integer.parseInt(qntJogos);
            max = Integer.parseInt(numMax);

            //if que verifica se o valor max é suficiente em relação aos digitos
            if (max / 2 >= numeros) {

                for(int i = 0; i < jogo.length; ++i)
                    jogo[i] = 0;

                //for número de jogos
                for(int z = 0; z < jogos; ++z) {

                    //for que sorteia os números
                    for(int i = 0; i < numeros; ++i) {

                        int jogoTmp = 1 + numeroAleatorio.nextInt(max);
                        jogo[i] = jogoTmp;

                    } //fim do for que sorteia os números

                    //for que passa os valores do array para acumular em uma string
                    for(int i = 0; i < numeros; ++i) {

                        jogoFinal += String.valueOf(jogo[i]) + " ";

                    } //fim do for que passa os valores do array para acumular em uma string

                    //adiciona o jogo no array que guarda os jogos
                    listaJogos[z] = "Jogo " + String.valueOf(1+z) + ": " + jogoFinal;

                    //coloca a variável jogoFinal novamente como ""
                    jogoFinal = "";

                } //fim do for número de jogos

            }
            else
                JOptionPane.showMessageDialog(null, "O valor máximo tem que ser no mínimo duas vezes maior que a quantidade de números!!",
                        "Corriga o valor máximo", JOptionPane.INFORMATION_MESSAGE);
                //fim do if que verifica se o valor max é suficiente em relação aos digitos

        }
        else
            JOptionPane.showMessageDialog(null, "É fundamentão que seja digitado valores em todos os campos!!",
                    "Faltou campo a ser digitado", JOptionPane.INFORMATION_MESSAGE);
            //fim do if que verifica se todos os campos foram preenchidos
        
    } //fim do método sorteador

} //fim da classe Bicho

Peço mais uma vez desculpas se o código tiver sujo, é que não tenho muito tempo que comecei a programar em java.