Foro de elhacker.net

Programación => Java => Mensaje iniciado por: Juanfernandez0032 en 20 Octubre 2016, 23:53 pm



Título: Mas logica que java - dos botones JToggleButton
Publicado por: Juanfernandez0032 en 20 Octubre 2016, 23:53 pm
Hola a todos, antes que nada aclaro que el ejercicio muy basico que tengo que hacer
se podria hacer tranquilamente con un checkbox jcombobox y otros componentes...
Pero pasa mas que nada por entender la logica en este caso usando JToggledButton.

Tengo que tener dentro de un JPanel 2 JToggleButton.
Cada vez que se pulsa uno los otros tiene que quedar en isSelected(false)
Bien, ahora si uno que esta pulsado, se vuelve a pulsar TODOS tienen que quedar
en isSelected(false).
Como si fuesen palancas, la logica tiene que funcionar para 2 botones o para cien.

El codigo es este pero pero si presiono TRES veces el mismo boton cualquiera sea, la tercera no queda presionado.
A alguien se le ocurre algo u otro diseño...


parece mucho codigo pero es muy basico ;)

Código:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class PruebaPalancas extends JPanel{

public static void main(String [] args){

JFrame miVentana = new JFrame();

Palancas misPalancas = new Palancas();

miVentana.add(misPalancas);
miVentana.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
miVentana.setLocationRelativeTo(null);
miVentana.pack();
miVentana.setVisible(true);

}

}

class Palancas  extends JPanel{

int contador = 0; // verifica si es la primera vez que se entra al bucle
boolean bSelect = false; //verifica si el boton fue presionado o no.

JToggleButton palanca1 = new JToggleButton("palanca1");
JToggleButton palanca2 = new JToggleButton("palanca2");

JToggleButton ultimo = new JToggleButton();

public Palancas(){

JPanel pruebaPanel = new JPanel();
pruebaPanel.setLayout(new GridLayout(7,1,5,5));
JTBEvento jtbEvento = new JTBEvento();

palanca1.addActionListener(jtbEvento);
palanca2.addActionListener(jtbEvento);

pruebaPanel.add(palanca1);
pruebaPanel.add(palanca2);



this.add(pruebaPanel);

}

class JTBEvento implements ActionListener{

public void actionPerformed(ActionEvent e){

System.out.println(contador + " " + bSelect); //

if(contador == 0){ //significa que todos los botones NO estaban presionados y hay chequear cual esta ahora

bSelect = palanca1.isSelected();
if(palanca1.isSelected()){

System.out.println("Palanca1" + " " + bSelect);
contador++;
ultimo = palanca1;

}

bSelect = palanca2.isSelected();
if(palanca2.isSelected()){

System.out.println("Palanca2" + " " + bSelect);
contador++;
ultimo = palanca2;

}

}else{

ultimo.setSelected(false);

// System.out.println(((JToggleButton) e.getSource()).getName() + " objeto");

bSelect = palanca1.isSelected();
if(palanca1.isSelected()){

System.out.println("Palanca1" + " " + bSelect);
contador++;
ultimo = palanca1;

}

bSelect = palanca2.isSelected();
if(palanca2.isSelected()){

System.out.println("Palanca2" + " " + bSelect);
contador++;
ultimo = palanca2;

}

} //cierre de listener


}

}
}




Título: Re: Mas logica que java - dos botones JToggleButton
Publicado por: Juanfernandez0032 en 22 Octubre 2016, 23:14 pm
Hola Pequeño Rafa, te paso una posible solucion, la veo poco elegante
codigo un poco engorroso, abuso de if (en el caso de que hayan muchos botones), pero funciona.
Lo ideal seria hacer algo recursivo con menos lineas pero por ahora es lo que hay.
Lo bueno que te sirve con cualquier componente que tenga dos estados.
Slds!!



Código:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class PruebaPalancas extends JPanel{

public static void main(String [] args){

JFrame miVentana = new JFrame();

Palancas misPalancas = new Palancas();

miVentana.add(misPalancas);
miVentana.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
miVentana.setLocationRelativeTo(null);
miVentana.pack();
miVentana.setVisible(true);

}

}

class Palancas  extends JPanel{

JToggleButton palanca1 = new JToggleButton("palanca1");
JToggleButton palanca2 = new JToggleButton("palanca2");

JToggleButton ultimoBoton;

public Palancas(){

JPanel pruebaPanel = new JPanel();
pruebaPanel.setLayout(new GridLayout(7,1,5,5));
JTBEvento jtbEvento = new JTBEvento(); // JTB = JToggleButton

palanca1.addActionListener(jtbEvento);
palanca2.addActionListener(jtbEvento);

pruebaPanel.add(palanca1);
pruebaPanel.add(palanca2);

this.add(pruebaPanel);

}

class JTBEvento implements ActionListener{

public void actionPerformed(ActionEvent e){

int botonesPulsados  = 0;

if(palanca1.isSelected()){botonesPulsados++;}
if(palanca2.isSelected()){botonesPulsados++;}

if(botonesPulsados == 0){ultimoBoton = null;}

if(botonesPulsados == 2){

if(palanca1.isSelected()){
if(palanca1 == ultimoBoton){
System.out.println("Ultimo boton presionado: Palanca1 ");
palanca1.setSelected(false);
botonesPulsados = 1;
}
}

if(palanca2.isSelected()){
if(palanca2 == ultimoBoton){
System.out.println("Ultimo boton presionado: Palanca2");
palanca2.setSelected(false);
botonesPulsados = 1;
}
}
}

if(botonesPulsados == 1){

if(palanca1.isSelected()){
System.out.println("Palanca1 Presionada");
ultimoBoton = palanca1;
}

if(palanca2.isSelected()){
System.out.println("Palanca2 Presionada");;
ultimoBoton = palanca2;
}
}

} //cierre del actionPerformed

} // cierre del actionListener
}