Página Inicial do Fórum > Java Avançado

[Ajuda] Batalha Naval



Criar novo tópico   Responder tópico


  1. Welter
    Posts:4


    Comment Arrow

    Publicado em: 30/06/2010 20:05:54

    Olá, estou tendo uns problemas com a parte gráfica no jogo "Batalha Naval" que estou fazendo.

    Como nessa interface eu uso vários botões (36 botões, que representam as coordenadas de uma matriz 6x6) eu preciso de um método que me retorne o nome do botão pressionado (não o texto que está nele, o nome da variável do botão), ex: se eu clicar no botão jButton1x1, ou jButton1x2, ou jButton1x3, ou jButton1x4...quero que o programa retorne o nome da variável desse botão para através da string do nome dele obter as coordenadas e assim verificar o que o 'tiro' atingiu na matriz. Espero ter sido claro, obrigado.
    _________________
    Guilherme André Welter
    ---------------------------

    Técnico em informática pelo IFSC (antigo CEFET)

    Graduando em Sistemas de Informação pela UFSC




  1. staroski
    Posts:3367


    Comment Arrow

    Publicado em: 30/06/2010 22:05:30

    JButton possui um método setName e getName que é justamente para você dar um nome aquele botão, não é o texto que aparece, é só um nome para você utilizar como bem entender.

    Creio que vai te ajudar bastante

    Para retornar o nome da variável você teria um trabalho do cão usando reflection...
    Ou então você poderia armazenar seus botões numa matriz 6x6 e a cada evento percorrer a matriz para descobrir a coordenada dele...

    Mas acho que no seu caso o mais simples é usar o atributo name da classe JButton...

    _________________
    Ricardo Artur Staroski, OCP-JP
    Blumenau - SC




  1. Welter
    Posts:4


    Comment Arrow

    Publicado em: 30/06/2010 20:05:54

    Certo, eu já havia tentando usar o método getName, que sempre retornava null, mas agora com a sua ajuda e usando setName antes, o getName está sendo útil, e assim também dar utilidade ao método substring que é o que eu realmente buscava.

    Sobre reflection, enquanto pesquisava uma forma de descobrir o nome da variável, realmente várias pessoas citaram o uso dessa ferramenta, mas ela parece mesmo complicada. Tendo mais idéias pode postá-las.

    Obrigado pela ajuda.
    _________________
    Guilherme André Welter
    ---------------------------

    Técnico em informática pelo IFSC (antigo CEFET)

    Graduando em Sistemas de Informação pela UFSC




  1. simu
    Posts:9416


    Comment Arrow

    Publicado em: 01/07/2010 07:12:17

    Welter
    Olá, estou tendo uns problemas com a parte gráfica no jogo "Batalha Naval" que estou fazendo.

    Como nessa interface eu uso vários botões (36 botões, que representam as coordenadas de uma matriz 6x6) eu preciso de um método que me retorne o nome do botão pressionado (não o texto que está nele, o nome da variável do botão), ex: se eu clicar no botão jButton1x1, ou jButton1x2, ou jButton1x3, ou jButton1x4...quero que o programa retorne o nome da variável desse botão para através da string do nome dele obter as coordenadas e assim verificar o que o 'tiro' atingiu na matriz. Espero ter sido claro, obrigado.


    Bom dia.

    Não é necessário voce obter o nome da variável:


    complicado: obter as coordenadas do JButton relativo ao componente onde ele se encontra e aplicar um pouco de matemática.


    menos complicado: criar uma estrutura ou usar o Point para representar as coordenadas e usar um Map (HashMap) para associar as coordenadas com cada JButton.


    menos complicado: usar o attributo Name do JButton (ou o ActionCommand) - setName(String) e getName() (ou setActionCommand(String) e getActionCommand()) - para armazenar as coordenadas em cada JButton. Name é um attributo dos componentes gráficos que pode ser usado para o que voce quiser. Na hora de criar o JButton voce chama o setName para setar o nome de cada um conforme desejado.


    muito pouco complicado, mas mais OO: criar uma classe que implemente o ActionListener que tambem contem as coordenadas, usando uma instância para cada JButton.

    dependendo do caso, é mais fácil/indicado, voce armazenar o celula (do jogo) em vez das coordenadas no ActionListener...

    [[]]
    _________________
      Nome real: Carlos F. Heuberger

    Removeram os meus direitos de administrador e moderador - sem aviso, pela segunda vez - contate o ombudsman (?), a equipejavafree ou a "alta gerência" se necessário - Que pena... que terminou dessa maneira!

    "The mod javafree deserves, but not the one it needs right now."
    --------------------
    Não leio nem respondo MPs!
    This posting is provided AS IS with no warranties and confers no rights.




  1. Welter
    Posts:4


    Comment Arrow

    Publicado em: 30/06/2010 20:05:54

    Obrigado pelas sugestões Simu, vou mostrá-las ao meu professor hoje e ver se ele me pode me explicá-las melhor...

    Usando setName e getName criei uma classe Listener(ainda incompleta) que ficou desse jeito:



    É uma forma simples, mas com ela eu evito de usar um actionPerformed para cada botão na classe da tela, o que deixava o jogo um pouco pesado pra abrir e o código fonte desnecessariamente extenso.
    _________________
    Guilherme André Welter
    ---------------------------

    Técnico em informática pelo IFSC (antigo CEFET)

    Graduando em Sistemas de Informação pela UFSC




  1. staroski
    Posts:3367


    Comment Arrow

    Publicado em: 30/06/2010 22:05:30

    O listener que o Simu exemplificou é mais legal ainda, eu usaria o dele ao invés de ficar fazendo substring.
    _________________
    Ricardo Artur Staroski, OCP-JP
    Blumenau - SC




  1. Welter
    Posts:4


    Comment Arrow

    Publicado em: 30/06/2010 20:05:54

    Bom, eu gostaria de ter o nível de instrução necessário então implementaria essa técnica, o problema é que estou com pouco tempo para desenvolver o jogo, então após ter uma versão que funcione irei pesquisar mais sobre essa técnica citada, até porque irei usar esse jogo posteriormente como um trabalho acadêmico.

    Futuramente posso até disponibilizar o projeto nesse tópico para vocês avaliarem e quem sabe ajudar numa otimização do sistema sem assim desejarem, agradeço a ajuda.
    _________________
    Guilherme André Welter
    ---------------------------

    Técnico em informática pelo IFSC (antigo CEFET)

    Graduando em Sistemas de Informação pela UFSC




  1. simu
    Posts:9416


    Comment Arrow

    Publicado em: 01/07/2010 07:12:17

    Welter
    Obrigado pelas sugestões Simu, vou mostrá-las ao meu professor hoje e ver se ele me pode me explicá-las melhor...

    Usando setName e getName criei uma classe Listener(ainda incompleta) que ficou desse jeito:



    É uma forma simples, mas com ela eu evito de usar um actionPerformed para cada botão na classe da tela, o que deixava o jogo um pouco pesado pra abrir e o código fonte desnecessariamente extenso.


    com o setName/getName realmente fica bem simples, um bom começo, mas é menos orientado a objetos. Minha experiência é que, pelo para sistemas maiores e principalmente que "vivem" mais tempo, esse tipo de solução no fim acaba dificultando. è mais complicado fazer mudanças, adaptar os objetos de acordo com novas especificações, ...

    De começo tambem sempre tive "preguiça" de criar classes (aparentemente desnecessárias) mas ultimamente prefiro fazer o contrário, nunca economizar nas classes. Os programas ficam muito mais flexíveis e fácil de mudar.

    E pode ter certeza, a não ser que esteja programando para algum dispositivo móvel com memória muito restringida, usar uma INSTÂNCIA de um ActionListener (2-3 variáveis locais) para cada botão (só 36) não e pesado nem (desnecessariamente) extenso. Lembre que cada String é uma instância, "pior" ainda, dá uma olhada quantos campos/variáveis tem o JButton (é só olhar quantas superclasses o JButton tem). O ActionListener é um dos ojetos que menos memória usa...

    Concordo que é uma técnica um pouco mais avançada, bom tgambem estamos na seção "Java Avançado" do fórum, mas vale a pena aprender/usar (quando tiver mais tempo)...

    [[]]
    _________________
      Nome real: Carlos F. Heuberger

    Removeram os meus direitos de administrador e moderador - sem aviso, pela segunda vez - contate o ombudsman (?), a equipejavafree ou a "alta gerência" se necessário - Que pena... que terminou dessa maneira!

    "The mod javafree deserves, but not the one it needs right now."
    --------------------
    Não leio nem respondo MPs!
    This posting is provided AS IS with no warranties and confers no rights.




  1. Relacionados





Novo tópico   Responder tópico     Índice do forum -> Java Avançado