Componentes básicos.

Correspondencia en Python —>

Dos de los componentes que más se van a utilizar en un entorno gráfico de Java son:

  • JLabel: Contiene texto configurado por la propia aplicación. Sería el equivalente al System.out.print para la consola.
  • JTextField: El usuario puede introducir texto en estos componentes que después serán usados por la aplicación. Es el equivalente a la clase Scanner de consola.
  • Asociados a ambos, puede ir un componente tipo JButton que será el que desencadene el evento que dé lugar a que el programa realice su trabajo.

Debemos de tener en cuenta que cualquier componente debe de situarse en la ventana utilizando alguno de los tres sistemas de posicionamiento. Cada uno de ellos tiene unas ventajas y unos inconvenientes, por lo que tendremos que valorar cuál de ellos será el que mejor se adapte a nuestro programa y a sus ventanas.

Veamos un ejemplo de código donde se muestran estos tres componentes. Se trata de un programa que nos solicita un número entero (menor de 18 dígitos) y va a descomponer dicho número en sus factores primos. El primer archivo va a contener los componentes y su configuración:

import javax.swing.*;
import java.awt.*;
import java.util.ArrayList;

public class Pruebas {
    public static void main(String[] args) {

        MiVentana ventana_nueva=new MiVentana();
        ventana_nueva.setVisible(true);

        JLabel etiqueta = new JLabel("Indica un Nº entero:");
        etiqueta.setFont(new Font("Arial", Font.BOLD, 24));
        etiqueta.setBackground(Color.RED);
        etiqueta.setForeground(new Color(191,246,225));
        etiqueta.setOpaque(true);
        etiqueta.setBounds(45, 60, 275, 60);

        JTextField su_numero= new JTextField();
        su_numero.setFont(new Font("Arial", Font.BOLD, 24));
        su_numero.setBackground(Color.RED);
        su_numero.setForeground(new Color(191,246,225));
        su_numero.setBounds(375, 60, 220, 60);

        JButton sus_factores=new JButton("Pulsa para calcular sus factores primos" );
        sus_factores.setFont(new Font("Arial", Font.BOLD, 24));
        sus_factores.setBackground(Color.RED);
        sus_factores.setForeground(new Color(191,246,225));
        sus_factores.setBounds(45, 160, 600, 60);

        JLabel resultado = new JLabel("Sus factores primos son:");
        resultado.setFont(new Font("Arial", Font.BOLD, 22));
        resultado.setBackground(Color.RED);
        resultado.setForeground(new Color(191,246,225));
        resultado.setOpaque(true);
        resultado.setBounds(45, 290, 900, 60);

        sus_factores.addActionListener(e->{
            String introducido=su_numero.getText();
            if (introducido.length()>18){
                resultado.setText("Por favor, deben ser menos de 18 dígitos.");
            }
            else {
                try{
                    long numero_entero=Long.parseLong(introducido);
                    if (numero_entero<2) {
                        int falso=3/0;
                    }
                    String resultado_texto="";
                    ArrayList<Long> lista_primos= Operaciones.lista_factores(numero_entero);
                    for (int k=0; k<lista_primos.size(); k++){
                        resultado_texto=resultado_texto+lista_primos.get(k)+" - ";
                    }
                    resultado.setText(resultado_texto);
                }
                catch (Exception exception){
                    resultado.setText("Introduzca un número entero mayor que 1.");
                }

            }

        });

        ventana_nueva.add(etiqueta);
        ventana_nueva.add(su_numero);
        ventana_nueva.add(sus_factores);
        ventana_nueva.add(resultado);
    }
}

JLabel etiqueta = new JLabel(«Indica un Nº entero:»); Instancia un el elemento de la clase JLabel y le asigna un texto a dicho componente.

etiqueta.setFont(new Font(«Arial», Font.BOLD, 24)); Le da formato al texto del objeto etiqueta. Si no se indicase, se le asignaría el de por defecto.

etiqueta.setBackground(Color.RED); Establece su color de fondo.

etiqueta.setForeground(new Color(191,246,225)); Indica el color del texto. Vemos que hay dos formas de dar color a un componente, o bien directamente con el nombre del color (Color.RED), o bien indicando los tres valores del código RGB del color (new Color (191,246,225).

etiqueta.setOpaque(true); Si establecemos un color de fondo para JLabel, debemos de especificar true para setOpaque. De lo contrario no se visualizaría dicho color de fondo.

etiqueta.setBounds(45, 60, 275, 60); En el archivo MiVentana que define el JFrame y que se muestra más abajo, se especifica como sistema de posicionamiento de los componentes de la ventana setLayout(null); Esto obliga a definir la posición exacta que va a tener el componente dentro de la ventana. En este caso se especifica que la x=45, la y=60, el ancho=275 y el alto=60.

JTextField su_numero= new JTextField(); A continuación se define un objeto de la clase JTextField, componente que nos servirá para que el usuario pueda introducir datos. Los cuatro métodos que le acompañan, son los mismos que los definidos para JLabel (no requiere el setOpaque).

JButton sus_factores=new JButton(«Calcular factores primos» ); Declaramos un objeto de la clase JButton. Es el botón que desencadenará alguna acción sobre el código.

sus_factores.addActionListener(e-> Esta instrucción nos apunta a un bloque lambda que contiene el bloque (encerrado entre corchetes) que se ejecutará al pulsar sobre el botón. Este bloque puede consistir en una instrucción simple, un bloque completo, o una función que será invocada.

String introducido=su_numero.getText(); Esta instrucción contenida dentro del bloque que se ejecutará al pulsar el botón, creará un objeto String donde quedará almacenado el contenido del campo JTextField, que será el texto introducido por el usuario.

El código que viene después comprueba que el texto introducido sea como mucho de 18 dígitos (lo hemos puesto así para no poner un número excesivamente grande que bloquee la ejecución del código).

Después pasamos el String a tipo Long, si no es posible esta conversión, saltaría el catch. Verificamos que se trate de un número mayor que 1, si fuese menor provocamos intencionadamente la excepción de división entre 0 y saltaría el código contenido en cath.

Hechas las comprobaciones, con la instrucción Operaciones.lista_factores(numero_entero); pasamos a esa función contenida en el segundo archivo el número obtenido. Dicha función se encargará de buscar los factores primos en que se descompone. Dichos factores primos se almacenarán como números en la lista lista_primos.

Después de darle formato de salida tipo texto a los números encontrados, los mostramos en el componente JLabel con la instrucción resultado.setText(resultado_texto)

Con el método ventana_nueva.add añadimos todos los componentes al JFrame.

El segundo archivo contiene las operaciones necesarias para averiguar los factores primos del número elegido.

package Utilidades_numeros;
import java.util.ArrayList;

public class Operaciones {

    public static ArrayList<Long> lista_factores(long descomponer){
        long el_numero=descomponer;
        boolean el_final;
        ArrayList<Long> nueva_lista=new ArrayList<>();
        el_final=false;

        while (el_final==false){
            long resultado=numero_primo(el_numero);
            if (resultado==0) {
                nueva_lista.add(el_numero);
                el_final = true;
            }
            else{
                nueva_lista.add(resultado);
                el_numero=(el_numero/resultado);
            }
        }
        return nueva_lista;
    }

    public static long numero_primo(long el_numero){
        int k;
        for (k=2; (k<=(el_numero/2)); k=k+1) {
            if ((el_numero % k) == 0)
                return k;
        }
        return 0;
    }
}

Finalmente un tercer archivo contendrá la clase MiVentana

import javax.swing.*;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class MiVentana extends JFrame  {

    public MiVentana() {
        setTitle("Mi ventana");
        setSize(1000, 600);
        setResizable(false);
        setLayout(null);
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        getContentPane().setBackground(new Color(200,250,55));

        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {

                int respuesta = JOptionPane.showConfirmDialog(
                        MiVentana.this,
                        "¿Desea cerrar la ventana?",
                        "Confirmar cierre",
                        JOptionPane.YES_NO_OPTION
                );

                if (respuesta == JOptionPane.YES_OPTION) {
                    dispose();
                }
            }
        });
    }
}

A continuación ejemplos de ejecución del código:

InicioComandos JavaBloques de código.
Comentar códigoSystem.out.printScanner (System.in)
Captura de erroresStringDatos Numéricos
Elementos aleatoriosDatos Fecha/horaConstantes
Bucles forBucles whileBloque if
ArraysArrayListswitch case
HashSetHashMapMétodos.
ClasesArchivosEntorno gráfico Swing
JFrame (Ventanas)Componentes básicos.