Ok, pues hagamos una interfaz completa.
Podemos comenzar preguntando con un JOptionPane cuántos alumnos se van a ingresar, igual que hemos hecho en el programa anterior.
Solo que esta vez no vamos a hacer ningún bucle, ya que con una interfaz gráfica no podemos usar un bucle como hicimos en las dos versiones anteriores.
Lo que haremos será mostrar tres campos de texto para las tres notas y un botón para aceptar y computar esas notas.
Al computar las notas, calcularemos y mostraremos el promedio de ese alumno en un área de texto que servirá como si fuera un listado, ya que para cada alumno se agregará una línea a esa lista.
Cada vez que computamos notas, aumentaremos un contador y cuando alcance el mismo valor que la cantidad de alumnos escogida, entonces desactivaremos los campos de texto para que el usuario sepa que ha terminado la inserción y mostraremos en otro campo de texto, el promedio total de todas los promedios calculados de los alumnos.
Y ahí terminaría el programa
Para construir esa interfaz, que es muy sencilla, lo que hago es usar un BorderLayout que nos permite dividir el marco JFrame en 5 zonas: norte, sur, este, oeste y centro.
De esas 5 zonas, solo voy a usar 4, donde colocaré distintos JPanel, cada uno escritos como una clase.
Así en lugar de dar forma a una interfaz completa de una sola vez, puedo hacerlo escribiendo códigos más pequeños para cada zona.
Así cada zona podrá tener sus propios layouts, según nos convenga.
Este sería el código. Parecen muchas líneas, pero es fácil de leer. Ya verás que cada una de las 4 zonas que componen toda la ventana, están escritas como clases individuales.
Así que para entender como se ha hecho el área de texto, o los campos de texto con el botón, no hay que leer el código entero. Solo la parte que corresponde a su clase.
La acción del botón también está escrito como una clase individual, que es donde ocurre lo interesante. Ahí se capturan los datos introducidos, se comprueba que son datos válidos, se computan, se actualizan contadores y acumuladores, etc...
Espero que te sirva. Pregunta lo que no entiendas o lo que creas que debería ser distinto.
Un saludo.
package promedioAlumnos;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
public class PromedioSwing extends JFrame {
private int na, contador;
private double sumaPromedios;
//Componentes
private JLabel etiqNorte;
private JTextField notaExFin, notaExPar, notaTrabFinal, promedFinal;
private JTextArea promedAlumnos;
private JButton btComputar;
//Paneles
private PanelNorte pnNorte;
private PanelCentral pnCentro;
private PanelSur pnSur;
private PanelEste pnEste;
public PromedioSwing() {
na = Integer.parseInt(
JOptionPane.showInputDialog(this, "¿Cuántos alumnos va a introducir?",
"Cantidad Alumnos", JOptionPane.QUESTION_MESSAGE));
sumaPromedios = 0;
contador = 0;
iniciarComponentes();
pnNorte = new PanelNorte();
pnCentro = new PanelCentral();
pnSur = new PanelSur();
pnEste = new PanelEste();
setLayout(new BorderLayout());
add(pnNorte, BorderLayout.NORTH);
add(pnCentro, BorderLayout.CENTER);
add(pnSur, BorderLayout.SOUTH);
add(pnEste, BorderLayout.EAST);
setTitle("Promedios Alumnos");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack();
setLocationRelativeTo(null);
setVisible(true);
}
private void iniciarComponentes() {
etiqNorte = new JLabel();
notaExFin = new JTextField(5);
notaExPar = new JTextField(5);
notaTrabFinal = new JTextField(5);
promedFinal = new JTextField(5);
promedFinal.setHorizontalAlignment(JTextField.CENTER);
promedFinal.setEditable(false);
promedAlumnos = new JTextArea(8,5);
promedAlumnos.setEditable(false);
btComputar = new JButton("Computar");
btComputar.addActionListener(new AccionComputar());
}
//Clases para modelar paneles
private class PanelNorte extends JPanel {
public PanelNorte() {
etiqNorte.setForeground(Color.BLUE);
etiqNorte.setFont(new Font("Arial", Font.BOLD, 30));
add(etiqNorte);
actualizaContador();
setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createEmptyBorder(15, 25, 10, 25),
BorderFactory.createLoweredSoftBevelBorder()));
}
public void actualizaContador() {
contador++;
etiqNorte.setText("NOTAS DE ALUMNO #" + contador + "/" + na);
}
}
private class PanelCentral extends JPanel {
public PanelCentral() {
JPanel panelesNotas = new JPanel();
panelesNotas.setLayout(new GridLayout(1,3,10,0));
panelesNotas.add(new PanelNota(new JLabel("Nota Examen Final:"), notaExFin));
panelesNotas.add(new PanelNota(new JLabel("Nota Examen Parcial:"), notaExPar));
panelesNotas.add(new PanelNota(new JLabel("Nota Trabajo Final:"), notaTrabFinal));
JPanel pnBoton = new JPanel();
btComputar.setFont(new Font("Arial", Font.BOLD, 25));
pnBoton.add(btComputar);
setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
add(panelesNotas);
add(pnBoton);
setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createEmptyBorder(25, 25, 25, 25),
BorderFactory.createRaisedSoftBevelBorder()));
}
public void limpiarCampos() {
notaExFin.setText(null);
notaExPar.setText(null);
notaTrabFinal.setText(null);
}
}
private class PanelSur extends JPanel {
public PanelSur() {
JLabel etiq = new JLabel("Promedio Total Alumnos:");
etiq.setFont(new Font("Arial", Font.PLAIN, 25));
add(etiq);
promedFinal.setFont(new Font("Arial", Font.BOLD, 25));
promedFinal.setForeground(Color.BLUE);
add(promedFinal);
setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createEmptyBorder(10,25,15,25),
BorderFactory.createRaisedSoftBevelBorder()));
}
}
private class PanelEste extends JPanel {
public PanelEste() {
setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
add(new JLabel("Promedios Alumnos"));
JScrollPane scroll = new JScrollPane(promedAlumnos);
add(scroll);
setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createCompoundBorder(
BorderFactory.createEmptyBorder(10, 10, 25, 25),
BorderFactory.createLoweredSoftBevelBorder()),
BorderFactory.createEmptyBorder(10, 10, 10, 10)
));
}
}
private class PanelNota extends JPanel {
public PanelNota(JLabel texto, JTextField campo) {
add(texto);
add(campo);
}
}
//Clase Listener
private class AccionComputar implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
String nota1 = notaExFin.getText();
String nota2 = notaExPar.getText();
String nota3 = notaTrabFinal.getText();
if (nota1.isBlank() || nota2.isBlank() || nota3.isBlank())
JOptionPane.showMessageDialog(null, "Ha de completar los tres campos",
"Computar notas", JOptionPane.WARNING_MESSAGE);
else {
try {
//Parseamos notas
double valor1 = Double.parseDouble(nota1);
double valor2 = Double.parseDouble(nota2);
double valor3 = Double.parseDouble(nota3);
//Calculamos promedio
double promedio = (((valor1*0.55)+(valor2*0.3)+(valor3*0.15)));
//Acumulamos para luego scar promedio final
sumaPromedios += promedio;
//Actualizamos lista de promedios
promedAlumnos.append(String.format("Alumno #%d: %.2f\n", contador, promedio));
//Limpiamos campos
pnCentro.limpiarCampos();
//Comprobamos si hemos terminado
if (contador == na) { //Hemos terminado
//Desactivamos interfaz
btComputar.setEnabled(false);
notaExFin.setEnabled(false);
notaExPar.setEnabled(false);
notaTrabFinal.setEnabled(false);
//Calculamos promedio final y mostramos
double promFin = sumaPromedios / na;
promedFinal.setText(String.format("%.2f", promFin));
//Anunciamos fin de proceso
JOptionPane.showMessageDialog(null, "Fin de inserción de datos",
"Fin", JOptionPane.INFORMATION_MESSAGE);
}
else //No hemos terminado
pnNorte.actualizaContador(); //Pasamos al siguiente alumno
}
catch(NumberFormatException ex) {
JOptionPane.showMessageDialog(null, "Introduzca solo valores numéricos",
"Computar notas", JOptionPane.WARNING_MESSAGE);
}
}
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new PromedioSwing();
}
});
}
}