Autor Tema: Programar botones de JFrame form en java  (Leído 1276 veces)

Yah616

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 1
    • Ver Perfil
Programar botones de JFrame form en java
« en: 16 de Octubre 2023, 01:20 »
Hola, estoy realizando un programa que calcula el área y el perimétro de un cuadrado, rectangulo y circulo. Ya esta la lógica terminada, pero necesito hacer que los valores de las figuras sean ingresadas por el usuario desde interfaz, cada figura tiene su propia interfaz (supongo que en clase la profesora nos enseñara a llamar todas estas ventanas a una principal).
La del circulo y el cuadrado tienen dos textfields, uno se encarga de recibir el radio del circulo/lado del cuadrado y el otro textfield muestra el resultado.
La del rectangulo tiene tres textfields, uno recibe la base del rectangulo, el segundo la altura y el tercero muestra el resultado.
Todas las interfaces cuentan con dos botones: área y perimétro, que deben de llamar a las clases que realizan estas operaciones (Cuadrado, Circulo y Rectangulo).
Pero no sé realmente como puedo hacer para que los botones obtengan los valores dados por el usuario para después hacer el calculo con sus respectivas clases y mostrar el resultado en el textfield.
Espero alguién me pueda ayudar, saludos cordiales.

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 988
    • Ver Perfil
Re: Programar botones de JFrame form en java
« Respuesta #1 en: 16 de Octubre 2023, 10:36 »
Hola.

Cada botón tendrá asociado su propio ActionListener, ¿no? Es decir, el código que le dice qué tiene que hacer dicho botón cuando sea pulsado.
Pues en ese código, a cada botón se le dirá que coja los datos de los TextField que le correspondan.

La interfaz, si no han dado indicaciones más específicas, se puede hacer mostrando tres JPanel en el JFrame, uno al lado del otro, donde cada JPanel corresponda a una de las tres figuras geométricas. Así todo está visible y no hay mayor complicación.
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 988
    • Ver Perfil
Re: Programar botones de JFrame form en java
« Respuesta #2 en: 17 de Octubre 2023, 01:36 »
A ver si este ejemplo te ayuda.
No se como construirás tú las interfaces Swing, supongo que con el GUI Builder de NetBeans, porque es lo que enseñan en todas partes.

Yo las hago escribiendo código, pero bueno, al fin y al cabo la lógica es la misma.
La interfaz que yo proponía era algo así:


Tres paneles, cada uno con sus botones y campos.
Cada panel se puede escribir como una clase independiente de las otras, así que cada botón puede acceder directamente a los campos que necesita para coger los datos y mostrar resultados.
En el ActionListener que escribimos para cada botón, le decimos con que campos ha de interactuar.
En mi caso, puesto que los escribo como clases independientes, es más fácil y queda más ordenado.
Si se hace con el builder y escrito todo como un único form, puede quedar más caótico al estar todos los JTextField declarados en una misma clase.
Pero bueno, mientras a cada uno se le de un nombre adecuado, luego en los ActionListener tan solo hay que llamar a los que corresponda según la figura.

En mi caso, tengo una clase PanelTriangulo
Código: [Seleccionar]
public class PanelTriangulo extends JPanel {

private JTextField campoAltura;
private JTextField campoBase;
private JTextField campoResultado;
private JButton btCalcular;

public PanelTriangulo() {
campoBase = new JTextField(8);
campoAltura = new JTextField(8);
campoResultado = new JTextField(8);
campoResultado.setEditable(false);
btCalcular = new JButton("Calcular");
btCalcular.addActionListener(new AccionCalcular());

setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
JLabel lbImagen = new JLabel(new ImageIcon(this.getClass().getClassLoader().getResource("areasFigurasSwing/triangulo.jpg")));
lbImagen.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
add(lbImagen);
add(new PanelCampo("Valor de Base: ", campoBase));
add(new PanelCampo("Valor de Altura: ", campoAltura));
JPanel pnBoton = new JPanel();
pnBoton.add(btCalcular);
add(pnBoton);
add(new PanelCampo("Area: ", campoResultado));

setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createEmptyBorder(15, 15, 15, 15),
BorderFactory.createTitledBorder("Area del Triangulo")));
}

private class AccionCalcular implements ActionListener {

@Override
public void actionPerformed(ActionEvent e) {
try {
double base, altura;
if (campoBase.getText().isBlank())
JOptionPane.showMessageDialog(null, "Introduzca valor de la Base");
else if (campoAltura.getText().isBlank())
JOptionPane.showMessageDialog(null, "Introduzca valor de la Altura");
else {
base = Double.parseDouble(campoBase.getText());
altura = Double.parseDouble(campoAltura.getText());
campoResultado.setText(String.format("%.2f", (base * altura) / 2));
}
}
catch(Exception ex) {
JOptionPane.showMessageDialog(null, "Introduzca valores numéricos");
}
}
}
}
Otra clase PanelCirculo
Código: [Seleccionar]
public class PanelCirculo extends JPanel {

private JTextField campoRadio;
private JTextField campoResultado;
private JButton btCalcular;

public PanelCirculo() {
campoRadio = new JTextField(8);
campoResultado = new JTextField(8);
campoResultado.setEditable(false);
btCalcular = new JButton("Calcular");
btCalcular.addActionListener(new AccionCalcular());

setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
JLabel lbImagen = new JLabel(new ImageIcon(this.getClass().getClassLoader().getResource("areasFigurasSwing/circulo.jpg")));
lbImagen.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
add(lbImagen);
add(new PanelCampo("Valor de Radio: ", campoRadio));
JPanel pnBoton = new JPanel();
pnBoton.add(btCalcular);
add(pnBoton);
add(new PanelCampo("Area: ", campoResultado));

setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createEmptyBorder(15, 15, 15, 15),
BorderFactory.createTitledBorder("Area del Círculo")));
}

private class AccionCalcular implements ActionListener {

@Override
public void actionPerformed(ActionEvent e) {
try {
double radio;
if (campoRadio.getText().isBlank())
JOptionPane.showMessageDialog(null, "Introduzca valor del Radio");
else {
radio = Double.parseDouble(campoRadio.getText());
campoResultado.setText(String.format("%.2f", Math.PI * Math.pow(radio, 2)));
}
}
catch(Exception ex) {
JOptionPane.showMessageDialog(null, "Introduzca valores numéricos");
}
}
}
}

Y la clase PanelCuadrado
Código: [Seleccionar]
public class PanelCuadrado extends JPanel {

private JTextField campoLado;
private JTextField campoResultado;
private JButton btCalcular;

public PanelCuadrado() {
campoLado = new JTextField(8);
campoResultado = new JTextField(8);
campoResultado.setEditable(false);
btCalcular = new JButton("Calcular");
btCalcular.addActionListener(new AccionCalcular());

setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
JLabel lbImagen = new JLabel(new ImageIcon(this.getClass().getClassLoader().getResource("areasFigurasSwing/cuadrado.jpg")));
lbImagen.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
add(lbImagen);
add(new PanelCampo("Valor de Lado: ", campoLado));
JPanel pnBoton = new JPanel();
pnBoton.add(btCalcular);
add(pnBoton);
add(new PanelCampo("Area: ", campoResultado));

setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createEmptyBorder(15, 15, 15, 15),
BorderFactory.createTitledBorder("Area del Cuadrado")));
}

private class AccionCalcular implements ActionListener {

@Override
public void actionPerformed(ActionEvent e) {
try {
double lado;
if (campoLado.getText().isBlank())
JOptionPane.showMessageDialog(null, "Introduzca valor del Lado");
else {
lado = Double.parseDouble(campoLado.getText());
campoResultado.setText(String.format("%.2f", lado * lado));
}
}
catch(Exception ex) {
JOptionPane.showMessageDialog(null, "Introduzca valores numéricos");
}

}
}
}

Todas ellas usan una pequeña clase llamada PanelCampo que simplemente construye un subpanel con un JTextfield y un texto para acompañarlo con un JLabel:
Código: [Seleccionar]
public class PanelCampo extends JPanel {

public PanelCampo(String texto, JTextField campo) {

setLayout(new FlowLayout(FlowLayout.CENTER, 10, 10));
add(new JLabel(texto));
add(campo);
}
}

Estas tres clases, se muestran en un mismo JFrame apilándolas en horizontal
Código: [Seleccionar]
public class Main extends JFrame {

public Main() {

setLayout(new BoxLayout(getContentPane(), BoxLayout.X_AXIS));
add(new PanelCuadrado());
add(new PanelCirculo());
add(new PanelTriangulo());

setTitle("Calcular Areas");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack();
setLocationRelativeTo(null);
setVisible(true);
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new Main();
}
});
}

}

Si no se quiere mostrar los tres paneles al mismo tiempo, se puede usar la clase JTabbedPane, con la cuál podemos crear paneles con "pestañas" para seleccionar la que queramos.
Solo hay que hacer un pequeño cambio en el constructor del JFrame:

Citar
public class Main extends JFrame {
   
   public Main() {
      
      JTabbedPane tabs = new JTabbedPane();
      tabs.addTab("Cuadrado", new PanelCuadrado());
      tabs.addTab("Círculo", new PanelCirculo());
      tabs.addTab("Triangulo", new PanelTriangulo());
      getContentPane().add(tabs);

      
      setTitle("Calcular Areas");
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      pack();
      setLocationRelativeTo(null);
      setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         @Override
         public void run() {
            new Main();   
         }
      });
   }

}

Y de esta forma, la interfaz queda un poco más cuqui:

« Última modificación: 17 de Octubre 2023, 01:39 por Kabuto »
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".