Seja bem vindo ao Fórum do JavaFree.org
Aqui você irá encontrar respostas para TUDO o que você precisa sobre java.
Deseja participar? Crie sua conta ou efetue seu login
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
---------------------------
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...
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
---------------------------
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!
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
---------------------------
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
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
---------------------------
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!
WelterPosts:4
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
staroskiPosts:3367
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
WelterPosts:4
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
simuPosts:9416