segunda-feira, 2 de maio de 2011

Listagem de dados com Struts2 e Hibernate em Netbeans

Olá, Inicia-se hoje uma série de tutoriais (começando por esse) de como fazer o elementar (CRUD) usando Struts2 com Hibernate em uma aplicação web. Usaremos como IDE o Netbeans com o plugin do Struts2. Para acompanhar esse tutorial, é recomendado que tenha lido o post anterior introdutório ao assunto.

Criando o banco de dados
No exemplo usamos PostgreSQL. A estrutura do banco de dados é a seguinte.
Banco: todolist
CREATE TABLE todolist
(
   id serial, 
   descricao character varying(200), 
   feito character(1), 
   CONSTRAINT pk_todolist PRIMARY KEY (id)
) 
WITH (
  OIDS = FALSE
)
;

insert into todolist (descricao,feito) values ('Fazer o pos no foojava.blogspo.com','S');
insert into todolist (descricao,feito) values ('Terminar a leitura do livro the long tail','N');
insert into todolist (descricao,feito) values ('Fazer artigo da prática de e-commerce','N');
insert into todolist (descricao,feito) values ('Terminar os layouts do sistema da COTRIMAIO','N');
insert into todolist (descricao,feito) values ('Estudar para prova de adm mercadológica','N');
insert into todolist (descricao,feito) values ('Estudar para prova de Redes e sist. distribuídos','N');




Criando o projeto
Na nossa IDE, criamos um projeto web, vou chamar de todolist.

Vamos lá! file > New project.

 Chamei de todolist, salvando no meu home, diretório padrão.

Agora, escolha o Apache Tomcat (se aparecer mais algum na lista). O resto dessa tela aceite as sugestões da IDE.

Aqui, você marca o Struts2, e desmarca para ele criar o arquivo de exemplo do struts2. Nesta mesma figura tem mais um item para marcar, seguimos abaixo.

Marque o Hibernate, mas não dê finish ainda, vamos aproveitar para fazer já a conexão  com o banco de dados. No combo destacado abaixo, crie uma nova conexão.

Aqui escolhi conectar com PostgreSQL, informo usuário, senha, banco ... Quando dou ok, devo selecionar qual schema (próxima tela), se as informações dessa tela conectaram no banco.

 Escolha o schema public. Agora sim, ok.

E Finish!

A essa altura o NetBeans incluiu as bibliotecas necessárias, fez uma configuração básica já do struts, hibernate o do web.xml (que define o projeto web).

Abaixo você pode ver a web.xml, que define quem é a página inicial quando esse projeto for rodado.



Definindo a Model

Projeto criado, hora de fazer a classe que fará o mapeamento do banco de dados. Essa classe será usada pelo hibernate, portanto, depois você terá que adicionar as anotations.

Crie um novo pacote, chame-o de model.




Dentro da model, clique com o direito e crie um novo "HibernateUtil", mudei apenas  o nome do arquivo em relação ao que a IDE me sugeriu.

Na tela anterior a IDE vai gerar um arquivo (HibernateUtil.java), ele está certo, não tem que mudar nada.

Agora dentro do pacote model, você precisa fazer a classe que mapeia o seu banco. Então, dentro da model, crie uma nova classe java. O nome dela é o nome da tabela no banco que essa classe vai representar, apenas com o primeiro caracter em maiúsculo.

Na tela abaixo, criei os atributos (linhas 13, 14 e 15), cliquei com o direito em "refactory" e depois em "Encapsulate fields", marquei que ele deveria gerar os geters e os seters de todos os atributos e sem comentários. Pronto! Gerou o código que você vê abaixo.

Bom, agora nessa mesma classe, temos que identificar para o Hibernate que isso representa uma tabela.  Então adicione as anotações das linhas 18, 19, 21 e 22.

Quando fizer isso vai a IDE vai ficar te apontando warnings, ctrl+enter em cima do warning (em cima do @Id por exemplo, @table) e faça os imports, todos do pacote javax. Não pegue os do hibernate.

Veja o código final da classe model na figura seguinte.



Criando a DAO (Data Access Object)
O nosso objeto de acesso a dados, nada mais é do aque algo que usa a model, e em cima disso cria as SQL's que deverão ser rodadas no banco para a aplicação trazer os dados/ fazer as ações que precisa.

Crie um novo pacote, chame-o de dao.

 Dentro do dao, crie uma classe chamada TodolistDAO.
 

Como esse exemplo é só uma listagem, não precisamos dos métodos para inserir, deletar, update, buscar dados de só um registro (para trazer para edição), então implementamos apenas o médoto de listagem de dados.

O que temos no código abaixo. Bom primeio criamos um atributo chamado session, essa session na verdade representa a conexão com o BD (linha 19).

Então, no construtor da classe (linhas 21, 22 e 23) dizemos que a session manda abrir uma sessão (conexão) que quem define é o HibernateUtils que criamos antes.

E depois, nas linhas 24 em diante, implementamos o método que retorna uma lista de dados. Veja que a gente não escreve SQL nenhuma, o hibernate faz isso.

* Os imports dessa classe sim, são do hibernate (org.hibernate) e não do javax.

Nos próximos post's mudaremos essa classe da dao para implementar as demais operaçãos.



Implementando a Action (controller)
A action não é bem um controller, mas ela tem ligação direta (da a resposta) para uma ação do usuário (que mais tarde será mapeada no struts.xml), então dava para dizer que o struts.xml + a action é o que a gente normalmente implementa em um controller.

Crie um pacote chamado action. E dentro dele a classe seguinte:


Aqui da mesma forma, criei o atributo na linha 17, depois deu refactor > encapsulate fields, e então implementei o código das linhas 27-30.

Explicando, essa propriedade é o valor que vai ser passado para view depois, portanto lá (na view) haverá um objeto chamado "todolist", porque assim o fizemos na linha 17 deste arquivo.

Aqui precisamos dar import na classe correspondente da dao e do model.

Perceba que o que você vai pagar na view é o que é setado (assessor set), no caso na minha linha 28, onde ele recebe a execução do método que implementamos na dao antes.

Mas e o get (assessor get)? Faça-o! O struts precisa disso.

O return de "SUCESSO" será usado depois no mapeamento, quando esse método retornar "SUCESSO" deve fazer o que... mais adiante. Calma aí.

Criando o JSP (view)

O JSP é a nossa view, quanto menos processamento, código, regra de negócio rodar aqui melhor!

Lembra que antes no web.xml estava definido que o index.jsp era a página padrão da nossa aplicação. Vamos modificá-lo, fazer um link de acesso a tela/ação que traz a listagem. Segue (mudanças destacadas)


Crie uma nova página jsp, essa será usada para printar as dados retornados pelo método da action. Chamei de todolist-list. O final (-list) é porque depois vai haver um -ins, -edit ...


Logo no início, adicione o que eu tenho na linha 6.
Depois, na 18 a 33, temos uma tabela para listar os dados, as primeiras linhas são o cabeçalho, depois iteramos o objeto todolist (linha 25) e mostramos os campos (assim como está definido no model). E é isso.



Ajustando os mapeamentos

Bom, vamos ajustar algumas coisas no hibernate.xml para ajudarmos a debugar se for preciso, e temos que mapear aqui a model.

Adicione os itens indicados.


 Clique em xml (antes estava em design) e adicione o mapeamento da classe onde está a definição da tabela.


No struts.xml, temos dizer quem responde pela aquela ação que colocamos lá no href do link no index.jsp. Assim definimos que tal ação, quando invocada chama tal classe, em tal método.

Bem no fim, adicione o que eu tenho na linha 14, isso faz as mensagens de erro do java serem mais amigáveis. Coloque para false antes de publicar a aplicação.

Em cima do projeto (botão auxliliar) clique em "clean and build" e depois em "run".


Rodando a aplicação

Quando você da "run" no projeto, o NetBeans da deploy automático, exceto das coisas da camada de persistência, portanto sempre que mexer em alguma coisa do hibernate, de "clean and build" antes do "run"

Executando, teremos algo parecido com isso:

 Clicando no link, que chama a ação, a action processa, devolve os dados e passa para view. E está aí!
Achou muita tralha para pouca coisa? Eu também. Mas pior sem frameworks. Deve ser por isso que a lenda diz que pagam bem para programador java.

Nos próximos, exclusão, cadastro, e edição.

Com chave estrangeira? Com chave estrangeira? Acompanhe o blog... quem sabe sai alguma coisa.

* Daqui um tempo (um mês por aí) vai começar uma série de posts de programação para Android, usando a SDK deles, com Java!

Foo!

sexta-feira, 29 de abril de 2011

Olá Mundo com Struts2 e NetBeans

Olá galerinha!!

Vamos pra mais um Hello World, agora com o Struts2. Pra comecar crie um novo projeto no NetBeans (estou usando no Linux, aqui no Foojava tem um post que ensina instalar tudo certinho), segue -> JavaWeb -> Aplicacao Web, de o nome de HelloStruts, estou a utilizar servidor Tomcat 6.0.26 e Java EE 5, no passo 4 selecione o framework Struts2 e desmarque a opcao de Criar pagina de exemplo, caso contrário o hello world já vem pronto de exemplo, sacanagem!

Segue imagens dessa primeira parte pra ajudar vocês que ficaram com alguma dúvida nessa primeira parte.




Bom, projeto criado, vamos editar o arquivo index.jsp que foi criado junto com o projeto, este arquivo está marcado para ser sua página inicial no arquivo web.xml. Dentro do index coloque o seguinte código:

<%-- 
    Document   : index
    Created on : 28/04/2011, 20:55:03
    Author     : bolivar
--%>

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">

<%-- Adicione essa taglib para usar as tags do Struts --%>
<%@taglib uri="/struts-tags" prefix="s" %>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
        <s:form action="Hello">
            <s:textfield name="nomeUsuario" label="Seu nome" />
            <s:submit />
        </s:form>
    </body>
</html>

Perceba que no início da página foi adicionado uma linha de código que inclui as tags especiais do Struts, para usar essas tags devemos adicionar o prefixo s: nas tags, é interessante dar uma olhada nessas tags, o NetBeans tem um autoComplete que msotra todas as tags possíveis de serem utilizadas. Essas tags serão substituidas por tags HTML normais quando o projeto for executado, em tempo de execução/compilaçao, não tenho bem certeza.

Crie agora mais duas páginas JSP, chame uma de sucesso.jsp e outra de erro.jsp.


 Na página de erro coloque apenas HTML normal com uma mesangem de erro e link para volar ao início.
<%-- 
    Document   : erro
    Created on : 28/04/2011, 21:08:18
    Author     : bolivar
--%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Primeiro Hello Struts</title>
    </head>
    <body>
        <p>
            Erro: Campo nome nao pode ser vazio, informe seu nome!<br><br>
            <a href="index.jsp">clique aqui pra voltar</a>
        </p>
    </body>
</html>

Na página de sucesso vamos utilizar novamente a taglib do Struts2, para exibir uma mensagem de Ola.
<%-- 
    Document   : sucesso
    Created on : 28/04/2011, 21:06:57
    Author     : bolivar
--%>

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">
<%@taglib uri="/struts-tags" prefix="s" %>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Primeiro Hello Struts</title>
    </head>
    <body>
        <h1><s:property value="mensagem" /></h1>
    </body>
</html>

Bom, até agora temos duas variáveis/propriedades para trabalhar, uma está na index.jsp que é o nomeUsuario e outra na página de sucesso que é a mensagem. Para manipularmos estes campos vamos criar uma classe Java que será a nossa Action, crie uma classe java dentro de um novo pacote chamado acoes. De o nome para a nova classe de HelloAction.



Criado a classe HelloAction, dentro de um pacote acoes, coloque o seguinte código.

package acoes;

/**
 * @author bolivar
 */
public class HelloAction {

    private String Mensagem;
    private String nomeUsuario;

    public String execute() {
        if (getNomeUsuario().length() > 0)
        {
            setMensagem("Ola " + getNomeUsuario());
            return "SUCESSO";
        } else
        {
            return "ERRO";
        }
    }

    /**
     * @return the Mensagem
     */
    public String getMensagem() {
        return Mensagem;
    }

    /**
     * @param Mensagem the Mensagem to set
     */
    public void setMensagem(String Mensagem) {
        this.Mensagem = Mensagem;
    }

    /**
     * @return the nomeUsuario
     */
    public String getNomeUsuario() {
        return nomeUsuario;
    }

    /**
     * @param nomeUsuario the nomeUsuario to set
     */
    public void setNomeUsuario(String nomeUsuario) {
        this.nomeUsuario = nomeUsuario;
    }
    
}

Esta classe estamos criando duas variáveis String que correspondem aos nossos elementos nas JSP, nomeUsuario e mensagem, implementamos os métodos GET e SET para definir valores e recuperar os valores dessas propriedades e criamos uma função chamada execute(), que é o método padrão das actions dentro do Struts.

Dentro desse método execute() nós verificamos se foi preenchido o campo nomeUsuario, em caso TRUE nós setamos a propriedade mensagem com o valor 'Olá ' e concatenamos com nome informado pelo usuário que está na propriedade nomeUsuario, tudo certo, retorna 'SUCESSO', este retorno é muito importante, não é necessário ter o nome 'sucesso', mas precisa existir para mapearmos dentro do struts depois.

No caso do usuário não ter digitado o seu nome, o método vai retornar 'ERRO'.

Muito bem, vamos para nossa parte final do Hello World, é impressão minha ou fazer um hello em Struts é super complicado? hehe Seguindo, agora só nos falta relacionar tudo isso dentro do arquivo de configuração struts.xml, o código abaixo simples e comentadinho.

<struts>
    <!-- Configuration for the default package. -->
    <package name="default" extends="struts-default">
        <!-- Configura as actions, o name é o que esta sendo chamada no form da index.jsp,
 class é local da action a ser executada e adicionei também o method execute, 
isso não é necessário quando o método tem este nome, mas se tivesse outro nome como remover, listar... ai seria necessário -->
        <action name="Hello" class="acoes.HelloAction" method="execute">
            <!-- Configura os resultados da action, em caso da funçao retornar SUCESSO 
vai ir para pagina JSP sucesso, caso de ERRO vai para erro.jsp -->
            <result name="SUCESSO">/sucesso.jsp</result>
            <result name="ERRO">/erro.jsp</result>
        </action>

    </package>
</struts>

Bom pessoal, basicamente é isso ai, para ver o Hello com Struts funcionando basta executar o projeto agora e correr pro abraço. A estrutura do projeto ficou igual a imagem abaixo.


Até mais!

quarta-feira, 30 de março de 2011

Netbeans + Tomcat + Struts2 + Hibernate + Linux

Buenas, vou mostrar aqui rapidamente como instar o Netbeans em Linux (alguma distro baseada em Debian). A diferença básica é que vamos instalar o servidor de aplicação Tomcat também, e vamos dar suporte a Struts2, e padrão o Netbeans suporta a 1.8 se não me engano.

Na teba abaixo tenho a versão completa baixada. Mando instalar:
sh nome_do_executavel.

Em seguida, resista a tentação de dar "next" na primeira tela e vá em "costomize".

Marque o Tomcat, e aí sim, daqui por diante é instalação padrão.


Se por um acaso, na tela seguinte ele reclamar que você não tem o JDK, ou ele não acha o path, mande instalar o JDK antes. Repita daí a instalação.

Hibenate
Não há nada a fazer, na instalação padrão vem com suporte tudo certinho, drivers para alguns bancos. Tudo ok.

Struts2
No o Netbeans instado, precisamos dar suporte a Struts2. Baixe esse aquivo aqui. Descompacte a pasta.

Abra o Netbeans, no menu "tools" e em seguida em "plugins", e na aba "downloaded". Vamos instalá-los.

Mande adicionar os plugins, busque-os, selecione-os.


E em seguida vá em "install".


Aceite os termos, mande continuar no aviso que ele fala da compatibilidade... e no fim ele vai pedir para reiniciar a IDE. Ok, pode ser.

Pronto! IDE configurada!

sábado, 27 de novembro de 2010

Jogo da Forca em Java

Olá pessoas!
Voltando a postar no Blog.
Desta vez, vou postar um joguinho que tivemos que fazer para a aula de Java, um jogo da Forca. Não é muito complicado, visual bonitinho e funciona \o/
Vou colocar as telas e o código abaixo.

Tela Inicial:

 Nesta tela, temos o desenho da forca e onde será colocado as letras para verificação e aparecem as dicas. Para jogar, é necessário ir em Arquivo, Novo Jogo, que habilitará as caixas de texto e ja sorteara uma palavra. Claro que pode não haver nenhuma palavra cadastrada, então o usuário terá que ir no menu Cadastrar, Palavras e Dicas, que será explicado depois.
Voltando ao jogo, uma palavra foi sorteada, como na imagem abaixo, mostrando a dica:
Após aparecer a dica, o usuário pode testar as letras, embaixo aparecerão riscos, mostrando quantas letras a palavra possui.
Testarei a letra E:
 Como a letra não existe na palavra, ele ja mostra uma parte da figura que formará o corpo do enforcado.
Vou agora inserir a letra A:
Como esta letra existe na palavra, ela aparece em seu(s) respectivo(s) lugar(es) nos riscos abaixo.
Completando com as letras C e S:
Como eu acertei a palavra, o programa exibe uma mensagem de que eu venci o jogo e me pede se eu quero jogar novamente. Se eu escolher Sim, ele sorteará uma nova palavra; se eu escolher Não, o programa será fechado.
Vou colocar agora os códigos para ver como funciona.
O Primeiro código será do botão Novo Jogo:




private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {                                           
   lblDigite.enable(true);//habilita os campos do jogo
   CampoTentar.enable(true);
   // btVerifica.enable(true); não desabilitar botão pq depois não habilita        TxtDica.enable(true);
   PalavraForca.enable(true);
   // Dá um reset no jogo:
   PalavraForca.setText("");//limpa os campos
   Tentativas.clear();//limpa as tentativas
   sortearpalavra(); //pega uma palavra do Txt e sorteia
   FimDoJogo=false; //Como ainda não é o fim do jogo, a opção se torna falsa
   LabelImagem.setIcon(icon0); //seta o ícone normal, do desenho da forca
   NumTentativas=0; // zera o numero de tentativas
   desenharpalavra(false);//a palavra só será desenhada se o usuário perder o jogo
}

O próximo código, é o do botao verificar:

private void btVerificaActionPerformed(java.awt.event.ActionEvent evt) {                                           
   if(!FimDoJogo){//verifica se não é o fim do jogo
      tentarletra(CampoTentar.getText());//se não for, pega a letra escrita e verifica se tem na palavra
      CampoTentar.setText("");//deixa o campo onde são digitadas as letras vazio
   }

}

Agora, vou colocar os métodos utilizados, que são chamados no menu e botão:


public class principal extends javax.swing.JFrame { //criacao de variáveis e definição das imagens e cria os vetores
    String PalavraSorteada = new String();
    ArrayList Tentativas = new ArrayList();
    int MaxTentativas = 6 ;
    int NumTentativas = 0 ;
    boolean FimDoJogo = true;
    ImageIcon icon0 = new ImageIcon("forca00.jpg");
    ImageIcon icon1 = new ImageIcon("forca11.jpg");
    ImageIcon icon2 = new ImageIcon("forca22.jpg");
    ImageIcon icon3 = new ImageIcon("forca33.jpg");
    ImageIcon icon4 = new ImageIcon("forca44.jpg");
    ImageIcon icon5 = new ImageIcon("forca55.jpg");
    ImageIcon icon6 = new ImageIcon("forca66.jpg");
    ArrayList PalavrasArquivo = new ArrayList();
    ArrayList DicasArquivo = new ArrayList();

Essas são as declarações no começo da classe; é necessário importar:


import java.awt.Image;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;
import javax.swing.ImageIcon;
import javax.swing.JDialog;


Abaixo, o método que faz o sorteio da palavra:

public void sortearpalavra() {
   try {
        File Arquivo = new File("Palavras.txt"); //lê o arquivo Txt
        FileReader leitor = new FileReader(Arquivo);
        BufferedReader leitorBuf = new BufferedReader(leitor);
        PalavrasArquivo.clear(); //limpa o temporario que armazena as palavras
        DicasArquivo.clear(); //limpa o temporaio que aramzena a dica

        String linha=null;

        while((linha = leitorBuf.readLine()) !=null){
              String colunas[] = linha.split("#"); //lê a linha contendo a palavra e a dica, sabendo q as mesmas sao separadas pelo
              PalavrasArquivo.add(colunas[0]);//caractere #
              DicasArquivo.add(colunas[1]);
        }

        leitorBuf.close();

        int TotalPalavras = PalavrasArquivo.size();//lê o tamanho da palavra para desenhar os traços
        int CodPalavraSorteada = (int) (Math.random()*(TotalPalavras)) ;//sorteia uma palavra randomicamente
        PalavraSorteada = (String) PalavrasArquivo.get(CodPalavraSorteada);//pega a plavra sorteada
        PalavraSorteada= PalavraSorteada.toUpperCase();//coloca em maiusculo
        TxtDica.setText("DICA: "+(String) DicasArquivo.get(CodPalavraSorteada));//pega a dica e exibe
   }
   catch(Exception ex) {
       System.out.println("Erro: "+ ex.toString());};
} 

O próximo método, é o que desenha a palavra na tela, nos riscos, quando o usuário acerta a palavra:

public void desenharpalavra(boolean MostrarTodaAPalavra){
    String tempTexto = new String();
    boolean faltauma = false;
    for(int n=1;n<=PalavraSorteada.length();n++){ //pega o tamanho da palavra e cria os tracinhos
        if((MostrarTodaAPalavra) || (Tentativas.contains(PalavraSorteada.substring(n-1, n)))){
            tempTexto=tempTexto+PalavraSorteada.substring(n-1, n);
        }else{
            tempTexto=tempTexto+"_";
            faltauma=true;
        }
        tempTexto=tempTexto+" ";
    }

    PalavraForca.setText(tempTexto);

    if(!faltauma){
       FimDoJogo=true;
           if ((NumTentativas)<6){ //verifica se o num de tentativas é menor q 6; se for, o usuario ganhou
                joga_nov.pack(); //abre a mensagem q pede se o usuário quer jogar novamente
                joga_nov.setLocationRelativeTo(null);
                joga_nov.setVisible(true);
           }
            
       // Dá pra mostrar uma outra mensagem aqui.
    }
}

O próximo método, é o qe verifica as letras se existem na palavra:

    public void tentarletra(String Letra){
        Letra= Letra.toUpperCase();
        if(Tentativas.contains(Letra)){
            // Mostrar mensagem de q já foi tentada esta letra
        }else{ 
            // Armazena a letra nova na lista de tentativas.
            Tentativas.add(Letra);
            if(PalavraSorteada.contains(Letra)){
                // Acertou
                desenharpalavra(false);
            }else{
                NumTentativas=NumTentativas+1;//vai adicionando o num de tentativas; se errar, adiciona o desenho
                switch(NumTentativas){
                    case(1):{
                        LabelImagem.setIcon(icon1);
                        break;
                    }
                    case(2):{
                        LabelImagem.setIcon(icon2);
                        break;
                    }
                    case(3):{
                        LabelImagem.setIcon(icon3);
                        break;
                    }
                    case(4):{
                        LabelImagem.setIcon(icon4);
                        break;
                    }
                    case(5):{
                        LabelImagem.setIcon(icon5);
                        break;
                    }
                    case(6):{
                        LabelImagem.setIcon(icon6);
                        FimDoJogo=true;
                        desenharpalavra(true);
                        FimDoJogo=true;
                        jogo_novo.pack();
                        jogo_novo.setLocationRelativeTo(null);
                        jogo_novo.setVisible(true);
                        break;
                    }
                }
            }
        }
    }

Esta é a tela que aparece se o usuário ganha o Jogo. Se clicar em Sim, o jogo recomeçará, com uma nova palavra; se Não, o jogo seá fechado.
O código no botão Sim é o seguinte:





private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        // Dá um reset no jogo:
        PalavraForca.setText("");
        Tentativas.clear();
        sortearpalavra();
        FimDoJogo=false;
        LabelImagem.setIcon(icon0);
        NumTentativas=0;
        desenharpalavra(false);
        joga_nov.setVisible(false);
    }

E no botão Não:

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        System.exit(0);
    }

Quando o usuário perde o jogo, as mensagens são as mesmas, com os mesmos códigos.

Vou passar agora para a parte do Cadastro. O post ta grandinho ja hehehe
Não estou explicando muito o código porque a maior parte está comentada. E acho que o código não é muito difícil de entender.
Continuando, a seguir a tela de Cadastro.

No primeiro Campo, o usuário digita a Palavra que ele quer que seja usada no jogo; na segunda, a Dica da palavra.
No botão Salvar, o código é o seguinte:










private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        BufferedWriter arquivo;
 String valores = txtpalavra.getText() + "#" + txtdica.getText();
 try {
  // abre o arquivo de texto para acrescentar linhas
  arquivo = new BufferedWriter(new FileWriter("Palavras.txt", true));
  // escreve a linha de texto
  arquivo.write(valores);
  // insere uma quebra de linha
  arquivo.newLine();
  // força a gravação dos dados em disco
  arquivo.flush();
  arquivo.close();
                txtpalavra.setText("");
                txtdica.setText("");
  }
 catch (IOException erro)
  {
  // trata o erro
  }
    } 

É claro que terá alguns imports também, nada muito complicado.

Bom, acho que no básico é isso.
Não sou uma grande Expert em Java, mas to aprendendo ^^
Faltou implementar algumas coisas também, quem sabe depois de modificar eu posto as mudanças aqui.

Eabaixo, segue o Link pra quem quiser fazer download do Jogo. Só não consegui fazer o .jar executável funcionar XD

http://www.4shared.com/file/NKEODY4G/FORCA.html


Fui! :D