Autor Tema: Ejercicios resueltos Swing Java crear aplicación formulario botones opción radio  (Leído 1339 veces)

Rigyel

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 2
    • Ver Perfil
Hola, solicito ayuda con estos ejercicios de java swing.

Dejo los ejemplos y ayudas, y los formularios hechos.

Generar números aleatorios.

Opción 1
Random num = new Random(); se declara la instancia a la clase Random()
int valor = (int)(num.nextDouble()*7);genera números aleatorios entre el 0 y el 6

Opción 2

int num=(int)(Math.random()*7); genera números aleatorios entre el 0 y el 6
int numero=(int)(Math.random()*(100-50+1)+50); valores entre 50 y 100

Generar un número aleatorio según el intervalo de números que se elija y
haciendo clic en el botón generar. El número se debe mostrar en un label.




Código: [Seleccionar]
import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.JLabel;
import java.awt.Font;
import javax.swing.JRadioButton;
import javax.swing.LayoutStyle.ComponentPlacement;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.Color;
import java.awt.SystemColor;

public class numeroaleatorio extends JFrame {

private JPanel contentPane;

/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
numeroaleatorio frame = new numeroaleatorio();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

/**
* Create the frame.
*/
public numeroaleatorio() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 452, 302);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);

JLabel lbTitulo = new JLabel("Generar Numeros");
lbTitulo.setFont(new Font("Tahoma", Font.PLAIN, 20));

JRadioButton rdbtn0y100 = new JRadioButton("Entre 0 y 100");

JRadioButton rdbtn100y200 = new JRadioButton("Entre 100 y 200");

JRadioButton rdbtn200y500 = new JRadioButton("Entre 200 y 500");

JButton btnGenerar = new JButton("Generar");
btnGenerar.setFont(new Font("Tahoma", Font.PLAIN, 15));
btnGenerar.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
}
});

JLabel lbResultado = new JLabel("");
lbResultado.setOpaque(true);
lbResultado.setForeground(Color.WHITE);
lbResultado.setFont(new Font("Tahoma", Font.PLAIN, 25));
GroupLayout gl_contentPane = new GroupLayout(contentPane);
gl_contentPane.setHorizontalGroup(
gl_contentPane.createParallelGroup(Alignment.LEADING)
.addGroup(Alignment.TRAILING, gl_contentPane.createSequentialGroup()
.addGroup(gl_contentPane.createParallelGroup(Alignment.LEADING)
.addGroup(gl_contentPane.createSequentialGroup()
.addGap(22)
.addComponent(lbTitulo))
.addGroup(gl_contentPane.createParallelGroup(Alignment.TRAILING, false)
.addGroup(Alignment.LEADING, gl_contentPane.createSequentialGroup()
.addGap(66)
.addComponent(lbResultado, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addGroup(Alignment.LEADING, gl_contentPane.createSequentialGroup()
.addGap(38)
.addComponent(btnGenerar, GroupLayout.PREFERRED_SIZE, 98, GroupLayout.PREFERRED_SIZE))))
.addPreferredGap(ComponentPlacement.RELATED, 89, Short.MAX_VALUE)
.addGroup(gl_contentPane.createParallelGroup(Alignment.LEADING)
.addComponent(rdbtn200y500)
.addComponent(rdbtn100y200)
.addComponent(rdbtn0y100))
.addGap(54))
);
gl_contentPane.setVerticalGroup(
gl_contentPane.createParallelGroup(Alignment.LEADING)
.addGroup(gl_contentPane.createSequentialGroup()
.addGap(40)
.addGroup(gl_contentPane.createParallelGroup(Alignment.BASELINE)
.addComponent(lbTitulo)
.addComponent(rdbtn0y100))
.addGroup(gl_contentPane.createParallelGroup(Alignment.LEADING)
.addGroup(gl_contentPane.createSequentialGroup()
.addGap(18)
.addComponent(rdbtn100y200)
.addGap(18)
.addComponent(rdbtn200y500))
.addGroup(gl_contentPane.createSequentialGroup()
.addGap(68)
.addComponent(btnGenerar, GroupLayout.PREFERRED_SIZE, 36, GroupLayout.PREFERRED_SIZE)))
.addGap(29)
.addComponent(lbResultado, GroupLayout.PREFERRED_SIZE, 30, GroupLayout.PREFERRED_SIZE)
.addContainerGap(22, Short.MAX_VALUE))
);
contentPane.setLayout(gl_contentPane);
}
}

2.-Crear una aplicación en java como a continuación se detalla:

El formulario debe tener:

• 4 botones de opción
• Un botón para salir de la aplicación. (Antes de cerrar el formulario debe preguntar si
se quiere salir de la aplicación).
• Una imagen que depende del botón de opción seleccionado.



Código: [Seleccionar]
int valor;
valor=JOptionPane.showConfirmDialog(rootPane, "¿Quiere Salir?","Salir...",
JOptionPane.YES_NO_OPTION,JOptionPane.QUESTION_MESSAGE);
 if(valor == 0)
 {
 System.out.print("Adios");
 System.exit(0);
 }
Ajustar imagen a label
ImageIcon fot = new ImageIcon(this.getClass().getResource("imagen.jpg"));
 Icon icono = new
ImageIcon(fot.getImage().getScaledInstance(lbImagen.getWidth()
 , lbImagen.getHeight(), Image.SCALE_DEFAULT));
 lbImagen.setIcon(icono);

3.-. Ingresar palabras a una lista (jList). Si la palabra comienza con vocal colocarla
en la lista de vocales, en caso contrario ingresarla a la lista de consonantes.



Validar que la exista una palabra ingresada en el campo de texto para ingresar.

4.-ingresar palabras



Se debe ingresar las palabras a un ArrayList. Validar:

• La palabra debe tener un largo de 10 caracteres como máximo
• Debe existir una palabra en el campo de texto antes de ingresarla
Mostrar palabras en una tabla (jTable). Si no existen palabras ingresadas debe
indicarlo con un mensaje.

5.-Permitir responder 4 preguntas y mostrar cada respuesta del usuario al hacer
clic en el botón mostrar, además, debe indicarse si la respuesta está buena o
mala (label con texto valor)


« Última modificación: 30 de Marzo 2021, 19:48 por Ogramar »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 724
    • Ver Perfil
Re: ayuda con ejercicios de java swing
« Respuesta #1 en: 18 de Noviembre 2020, 01:10 »
Hola.
Para el primer ejercicio, se me ocurre que aplicando POO se puede simplificar la lógica.

En lugar de usar JRadioButton directamente, se podría crear una clase que herede de JRadioButton.. y añadirle más funcionalidad.
Se le puede pedir que el mismo genere el número random.

Le añadimos dos atributos de tipo int: mínimo y máximo. Y por el constructor le indicamos el valor de esos atributos, así como el texto que ha de mostrar.
Y le implementamos un método que genere un numero random, entre el mínimo y máximo que se le ha establecido.
Código: [Seleccionar]
private class RadioGenerador extends JRadioButton {
private int minimo;
private int maximo;

public RadioGenerador(int min, int max, String texto) {
minimo = min;
maximo = max;
setText(texto);
setFocusPainted(false);
}

public int generaRandom() {
Random rnd = new Random();
return minimo + rnd.nextInt(maximo-minimo);
}
}
De esta manera, cada JRadioButton es capaz de generar un número al azar entre los límites correspondientes.

Cuando se pulse el botón generar, lo que haremos será recorrer los JRadioButton (interesa tenerlos en un array) para ver cuál es el que está seleccionado. Y cuando se encuentre el seleccionado, se le pide que nos de un random y ya se lo pasamos al JLabel para mostrarlo en pantalla.
Código: [Seleccionar]
private class AccionGenerar implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
int numAzar = 0;
//Buscamos en el array que Generador está seleccionado y le pedimos un random
for (RadioGenerador generador: generadores)
if (generador.isSelected())
numAzar = generador.generaRandom();
//Lo pasamos al JLabel
jlNumero.setText(String.format("%03d", numAzar));
}
}

Dejo a continuación el código completo.
Como ya dije en otro hilo, no uso NetBeans y la interfaz Swing la construyo de otra forma.
Pero bueno, si entiendes la lógica que he aplicado, supongo que lo podrás adaptar.



Código: [Seleccionar]
public class Generador extends JFrame{

private RadioGenerador[] generadores;
private JButton btGenerar;
private JLabel jlNumero;

public Generador() {

iniciarComponentes();

setLayout(new BorderLayout());
JPanel pnNorte = new JPanel();
pnNorte.add(new JLabel("Generador Números"));

JPanel pnCentro = new JPanel();
JPanel pnRadio = new JPanel();
pnRadio.setLayout(new BoxLayout(pnRadio, BoxLayout.Y_AXIS));
pnRadio.add(generadores[0]);
pnRadio.add(generadores[1]);
pnRadio.add(generadores[2]);
pnRadio.setBorder(BorderFactory.createEmptyBorder(20, 40, 20, 80));
JPanel pnBoton = new JPanel();
pnBoton.add(btGenerar);
pnCentro.setLayout(new BoxLayout(pnCentro, BoxLayout.Y_AXIS));
pnCentro.add(pnRadio);
pnCentro.add(pnBoton);

JPanel pnSur = new JPanel();
pnSur.setBorder(BorderFactory.createEmptyBorder(25, 25, 25, 25));
pnSur.add(jlNumero);

add(pnNorte, BorderLayout.NORTH);
add(pnCentro, BorderLayout.CENTER);
add(pnSur, BorderLayout.SOUTH);

setTitle("Generador Random");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack();
setLocationRelativeTo(null);
setVisible(true);
}

private void iniciarComponentes() {
generadores = new RadioGenerador[3];
generadores[0] = new RadioGenerador(0,100, "Entre 0 y 100");
generadores[1] = new RadioGenerador(100,200, "Entre 100 y 200");
generadores[2] = new RadioGenerador(200,500, "Entre 200 y 500");
ButtonGroup grupo = new ButtonGroup();
grupo.add(generadores[0]);
grupo.add(generadores[1]);
grupo.add(generadores[2]);
btGenerar = new JButton("GENERAR");
btGenerar.addActionListener(new AccionGenerar());
jlNumero = new JLabel(String.format("%03d", 0));
jlNumero.setFont(new Font("Verdana", Font.BOLD, 34));
jlNumero.setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createLineBorder(Color.BLACK, 5),
BorderFactory.createEmptyBorder(10, 10, 10, 10)));
}


private class RadioGenerador extends JRadioButton {
private int minimo;
private int maximo;

public RadioGenerador(int min, int max, String texto) {
minimo = min;
maximo = max;
setText(texto);
setFocusPainted(false);
}

public int generaRandom() {
Random rnd = new Random();
return minimo + rnd.nextInt(maximo-minimo);
}
}

private class AccionGenerar implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
int numAzar = 0;
//Buscamos en el array que Generador está seleccionado y le pedimos un random
for (RadioGenerador generador: generadores)
if (generador.isSelected())
numAzar = generador.generaRandom();
//Lo pasamos al JLabel
jlNumero.setText(String.format("%03d", numAzar));
}
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new Generador();
}
});
}
}
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: 724
    • Ver Perfil
Re: ayuda con ejercicios de java swing
« Respuesta #2 en: 18 de Noviembre 2020, 11:27 »
Segundo ejercicio.

Se puede seguir una lógica similar. De nuevo crear una clase hija de JRadioButton con un atributo String que contenga la ruta hacia la imagen asociada.
Así cada JRadioButton es capaz de proporcionar la ruta para crear e ImageIcon que le seteamos al JLabel
Código: [Seleccionar]
private class RadioImagen extends JRadioButton {
String rutaImagen;

public RadioImagen(String ruta, String texto) {
rutaImagen = ruta;
setText(texto);
}
}

Para ir cambiando la imagen, creamos una clase que implemente la interfaz ActionListener, para agregarsela a estos JRadioButton.

Esta acción se encarga de recuperar la ruta que propociona el radiobotón que ha sido pulsado y con ella, cambia la imagen del JLabel.

Código: [Seleccionar]
private class AccionFoto implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
//Recuperamos JRadioButon que recibe accion
RadioImagen radio = (RadioImagen) e.getSource();
//Le pedimos su ruta a la imagen asociada
jlFoto.setIcon(new ImageIcon(this.getClass().getClassLoader().getResource(radio.rutaImagen)));

}
}

Sobre las imágenes, no se si ya has trabajado con ellas.
Lo más cómodo es crear un package dentro del proyecto y colocarlas ahí. Luego usando ruta relativa se accede a ellas sin problema.



Y ya está. Dejo código completo a continuación



Código: [Seleccionar]
public class ElegirFoto extends JFrame{

private RadioImagen[] radioImagenes;
private JButton btSalir;
private JLabel jlFoto;

public ElegirFoto() {

iniciarComponentes();

setLayout(new BorderLayout());
JPanel pnNorte = new JPanel();
pnNorte.setLayout(new BoxLayout(pnNorte, BoxLayout.X_AXIS));
JPanel pnLabel = new JPanel();
pnLabel.add(new JLabel("Elija una opción para ver la imagen"));
JPanel pnBoton = new JPanel();
pnBoton.add(btSalir);
pnNorte.add(pnLabel);
pnNorte.add(pnBoton);

JPanel pnCentro = new JPanel();
pnCentro.setLayout(new BoxLayout(pnCentro, BoxLayout.X_AXIS));
JPanel pnRadios = new JPanel();
pnRadios.setLayout(new BoxLayout(pnRadios, BoxLayout.Y_AXIS));
for(RadioImagen radio: radioImagenes)
pnRadios.add(radio);
pnRadios.setBorder(BorderFactory.createEmptyBorder(20, 40, 60, 20));
JPanel pnFoto = new JPanel();
pnFoto.add(jlFoto);
pnFoto.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
pnCentro.add(pnRadios);
pnCentro.add(pnFoto);

add(pnNorte, BorderLayout.NORTH);
add(pnCentro, BorderLayout.CENTER);

setTitle("Selector Fotos");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack();
setLocationRelativeTo(null);
setVisible(true);
}

private void iniciarComponentes() {
radioImagenes = new RadioImagen[4];
radioImagenes[0] = new RadioImagen("img/perro300.jpeg", "Perro");
radioImagenes[1] = new RadioImagen("img/gato300.jpg", "Gato");
radioImagenes[2] = new RadioImagen("img/tigre300.jpg", "Tigre");
radioImagenes[3] = new RadioImagen("img/leon300.png", "Leon");
ButtonGroup grupo = new ButtonGroup();
radioImagenes[0].setSelected(true);

//Agrupamos los JRadioButton y de paso les añadimos su ActionListener
for (RadioImagen radio: radioImagenes) {
grupo.add(radio);
radio.addActionListener(new AccionFoto());
}

btSalir = new JButton("SALIR");
btSalir.addActionListener(new AccionSalir());

jlFoto = new JLabel(new ImageIcon(this.getClass().getClassLoader().getResource("img/perro300.jpeg")));
jlFoto.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
}

private class RadioImagen extends JRadioButton {
String rutaImagen;

public RadioImagen(String ruta, String texto) {
rutaImagen = ruta;
setText(texto);
}
}

private class AccionSalir implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
Object[] opciones = {"Claro, que SI", "Claro, que NO"};
int respuesta = JOptionPane.showOptionDialog(rootPane,
"¿Desea salir?", "Cerrar Programa", JOptionPane.DEFAULT_OPTION,
JOptionPane.QUESTION_MESSAGE, null, opciones, opciones[1]);

if (respuesta == 0)
System.exit(0);
}
}

private class AccionFoto implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
//Recuperamos JRadioButon que recibe accion
RadioImagen radio = (RadioImagen) e.getSource();
//Le pedimos su ruta a la imagen asociada
jlFoto.setIcon(new ImageIcon(this.getClass().getClassLoader().getResource(radio.rutaImagen)));

}
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new ElegirFoto();
}
});
}
}
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: 724
    • Ver Perfil
Re: ayuda con ejercicios de java swing
« Respuesta #3 en: 19 de Noviembre 2020, 01:37 »
Tercer Ejercicio.

En este caso yo lo que haría crear un "modelo" personalizado para los JList.
Que este modelo sea capaz por sí solo de comprobar si la palabra ya existe en la lista, y si no existe, añadirla.
Para esto creamos una clase que herede de AbstractListModel y le añadimos un ArrayList como atributo y un método boolean para añadir palabras.
Así el método comprueba si la palabra existe, en cuyo caso retorna FALSE indicando que se ha rechazado.
Y si no existe, la añade al ArrayList y notifica al modelo que la lista ha cambiado para que se actualice lo que se ve en pantalla.
Después retorna TRUE informando que la palabra ha sido aceptada.

Código: [Seleccionar]
private class ModeloLista extends AbstractListModel<String> {

private ArrayList<String> lista;

public ModeloLista() {
lista = new ArrayList<String>();
}
//Método para añadir palabras a la lista
public boolean addPalabra(String palabra) {

if (lista.contains(palabra))
return false; //Ya existe esta palabra. La rechazamos
else {
lista.add(palabra); //Añadimos palabra al ArrayList
fireIntervalAdded(this, getSize(), getSize() + 1); //Notificamos al modelo
return true; //Palabra aceptada
}
}
//Los siguientes dos métodos es obligatorio implementarlos al heredar de AbstractListModel
@Override
public int getSize() {
return lista.size();
}

@Override
public String getElementAt(int index) {
return lista.get(index);
}

}

Teniendo este modelo, creamos una clase que herede de JPanel a la que además del texto de cabecera le añadimos un JList que implemente el modelo que hemos creado.
Este panel tendrá un método que recibe la palabra ha insertar y se la pasa al método del modelo que acepta o rechaza la palabra.
Si la rechaza, lanza un JOptionPane informando.

Código: [Seleccionar]
private class PanelLista extends JPanel {

private ModeloLista modeloLista;

public PanelLista(String titulo) {

modeloLista = new ModeloLista();

JPanel pnTitulo = new JPanel();
pnTitulo.add(new JLabel(titulo));
pnTitulo.setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createEmptyBorder(10, 35, 10, 35),
BorderFactory.createBevelBorder(BevelBorder.RAISED)));

JPanel pnLista = new JPanel();
JList<String> lista = new JList<String>();
lista.setModel(modeloLista);

JScrollPane scrollLista = new JScrollPane(lista);
scrollLista.setPreferredSize(new Dimension(150, 200));
scrollLista.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
pnLista.add(scrollLista);

setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
add(pnTitulo);
add(pnLista);
setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createEmptyBorder(0, 25, 25, 25),
BorderFactory.createSoftBevelBorder(BevelBorder.RAISED)));
}

public void addPalabra(String palabra) {

if (!modeloLista.addPalabra(palabra))
JOptionPane.showMessageDialog(null, "Ya existe esta palabra.",
"Añadir Palabra", JOptionPane.WARNING_MESSAGE);
}

}


Teniendo esta clase PanelLista, crearemos dos paneles de este tipo, uno para que reciba las que empiezan por vocal y otro para que reciba consonantes.

¿Cómo y dónde decidimos a que panel hay que enviar un tipo de palabra u otro?

Podemos hacer que de eso se encargue el botón de ingreso.
En su ActionListener, haremos que recoja la palabra ingresada.
Si no se ha ingresado ninguna palabra, se lanza mensaje de advertencia

Si tenemos palabra, pues analiza el primer caracter para ver si es una vocal o una consonante. De este modo, se decide a que PanelLista hay que enviar esta palabra.

Código: [Seleccionar]
private class AccionIngresar implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
String palabra = jtPalabra.getText();
jtPalabra.setText(null);
jtPalabra.requestFocus();
if (!palabra.isEmpty() && !palabra.isBlank()) {
//Comprobamos primer caracter para ver si es vocal o consonante
switch(palabra.toLowerCase().charAt(0)) {
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':
listaVocales.addPalabra(palabra);
break;
default:
listaConsonantes.addPalabra(palabra);
}
}
else
JOptionPane.showMessageDialog(null, "¡Ha de ingresar una palabra!",
"Ingresar Palabra", JOptionPane.WARNING_MESSAGE);
}
}

Y nada más.
Ahora pongo el código completo



Código: [Seleccionar]
public class Listar extends JFrame{

private PanelLista listaVocales;
private PanelLista listaConsonantes;
private JTextField jtPalabra;
private JButton btIngresar;

public Listar() {

iniciarComponentes();

JPanel pnNorte = new JPanel();
JPanel pnPalabra = new JPanel();
pnPalabra.add(new JLabel("Ingrese Palabra"));
pnPalabra.add(jtPalabra);
JPanel pnBoton = new JPanel();
pnBoton.add(btIngresar);
pnNorte.add(pnPalabra);
pnNorte.add(pnBoton);
pnNorte.setBorder(BorderFactory.createEmptyBorder(20, 0, 20, 0));

JPanel pnCentro = new JPanel();
pnCentro.add(listaVocales);
pnCentro.add(listaConsonantes);

setLayout(new BorderLayout());
add(pnNorte, BorderLayout.NORTH);
add(pnCentro, BorderLayout.CENTER);

setTitle("Listas de palabras");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack();
setLocationRelativeTo(null);
setVisible(true);
}

private void iniciarComponentes() {
listaVocales = new PanelLista("Comienza con Vocal");
listaConsonantes = new PanelLista("Comienza con Consonante");
jtPalabra = new JTextField(12);
btIngresar = new JButton("Ingresar");
btIngresar.addActionListener(new AccionIngresar());
}

private class ModeloLista extends AbstractListModel<String> {

private ArrayList<String> lista;

public ModeloLista() {
lista = new ArrayList<String>();
}
//Método para añadir palabras a la lista
public boolean addPalabra(String palabra) {

if (lista.contains(palabra))
return false; //Ya existe esta palabra. La rechazamos
else {
lista.add(palabra); //Añadimos palabra al ArrayList
fireIntervalAdded(this, getSize(), getSize() + 1); //Notificamos al modelo
return true; //Palabra aceptada
}
}
//Los siguientes dos métodos es obligatorio implementarlos al heredar de AbstractListModel
@Override
public int getSize() {
return lista.size();
}

@Override
public String getElementAt(int index) {
return lista.get(index);
}

}

private class PanelLista extends JPanel {

private ModeloLista modeloLista;

public PanelLista(String titulo) {

modeloLista = new ModeloLista();

JPanel pnTitulo = new JPanel();
pnTitulo.add(new JLabel(titulo));
pnTitulo.setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createEmptyBorder(10, 35, 10, 35),
BorderFactory.createBevelBorder(BevelBorder.RAISED)));

JPanel pnLista = new JPanel();
JList<String> lista = new JList<String>();
lista.setModel(modeloLista);

JScrollPane scrollLista = new JScrollPane(lista);
scrollLista.setPreferredSize(new Dimension(150, 200));
scrollLista.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
pnLista.add(scrollLista);

setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
add(pnTitulo);
add(pnLista);
setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createEmptyBorder(0, 25, 25, 25),
BorderFactory.createSoftBevelBorder(BevelBorder.RAISED)));
}

public void addPalabra(String palabra) {

if (!modeloLista.addPalabra(palabra))
JOptionPane.showMessageDialog(null, "Ya existe esta palabra.",
"Añadir Palabra", JOptionPane.WARNING_MESSAGE);
}

}

private class AccionIngresar implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
String palabra = jtPalabra.getText();
jtPalabra.setText(null);
jtPalabra.requestFocus();
if (!palabra.isEmpty() && !palabra.isBlank()) {
//Comprobamos primer caracter para ver si es vocal o consonante
switch(palabra.toLowerCase().charAt(0)) {
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':
listaVocales.addPalabra(palabra);
break;
default:
listaConsonantes.addPalabra(palabra);
}
}
else
JOptionPane.showMessageDialog(null, "¡Ha de ingresar una palabra!",
"Ingresar Palabra", JOptionPane.WARNING_MESSAGE);
}
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new Listar();
}
});
}
}
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: 724
    • Ver Perfil
Re: ayuda con ejercicios de java swing
« Respuesta #4 en: 19 de Noviembre 2020, 03:09 »
Cuarto ejercicio.

Muy parecido al anterior.

Yo también crearía una tabla personalizada, con un modelo personalizado.

EL modelo tendría un ArrayList como atributo, que por el constructor recibiría uan referencia al ArrayList principal de palabras.
Así cuando pulsemos el boton "mostrar", llamamos a un método que actualice la tabla, y lo hará con las palabras que se hayan ingresado.

Código: [Seleccionar]
private class ModeloTabla extends AbstractTableModel {

ArrayList<String> palabras;
String[] nombreColumna = new String[]{"Palabras"};

public ModeloTabla(ArrayList<String> palabras) {
this.palabras = palabras;
}

public void actualizarTabla() {
fireTableDataChanged();
}

@Override
public String getColumnName(int col) {
return nombreColumna[col];
}

@Override
public int getRowCount() {
if (palabras == null)
return 0;
else
return palabras.size();
}

@Override
public int getColumnCount() {
return nombreColumna.length;
}

@Override
public Object getValueAt(int rowIndex, int columnIndex) {
return palabras.get(rowIndex);
}

}

Este modelo, se lo aplicamos a un JTable, o a una clase que herede de JTable, si queremos personalizar un poco el aspecto de la tabla.

Código: [Seleccionar]
private class MiTabla extends JTable {

public MiTabla() {
//Aplicamos nuestro modelo de tabla
super(modeloTabla);
//Pedimos al render que centre los textos en sus celdas.
DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer();
centerRenderer.setHorizontalAlignment(SwingConstants.CENTER);
setDefaultRenderer(Object.class, centerRenderer);
//Cambiamos alguna fuente y color para los datos de la tabla
setFont(new Font("Verdana", Font.PLAIN , 14));
setForeground(Color.BLUE);
//También cambiamos estilo de fuente a la cabecera
JTableHeader cabecera = getTableHeader();
cabecera.setFont(new Font("Verdana", Font.BOLD , 14));
}
}

Tendremos dos acciones para los correspondientes botones.
La accion "ingresar" recoge la palabra, comprueba que no supere 10 caracteres, y la inserta en el ArrayList principal.
No afecta para nada a la tabla, solo al ArrayList

Código: [Seleccionar]
private class AccionIngresar implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {

String palabra = jtPalabra.getText();
jtPalabra.setText(null);
jtPalabra.requestFocus();
if (!palabra.isEmpty() && !palabra.isBlank()) {
if (palabra.length() > 10)
JOptionPane.showMessageDialog(null, "La palabra no puede superar 10 caracteres",
"Ingresar Palabra", JOptionPane.WARNING_MESSAGE);
else
palabras.add(palabra);
}
else
JOptionPane.showMessageDialog(null, "¡Ha de ingresar una palabra!",
"Ingresar Palabra", JOptionPane.WARNING_MESSAGE);
}
}

La otra acción, la de "mostrar", simplemente le pide al modelo de la tabla que se actualice y esta lo que hará será mostrar las palabras que se encuentran insertada en el ArrayList.

Código: [Seleccionar]
private class AccionMostrar implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
modeloTabla.actualizarTabla();

}
}

Y eso es todo.



Código: [Seleccionar]
public class TablaPalabras extends JFrame{

private ArrayList<String> palabras;
private JTextField jtPalabra;
private JButton btIngresar;
private JButton btMostrar;
private ModeloTabla modeloTabla;
private MiTabla tabla;


public TablaPalabras() {

iniciarComponentes();

JPanel pnNorte = new JPanel();
pnNorte.add(new JLabel("Ingrese Palabra"));
pnNorte.add(jtPalabra);
pnNorte.setBorder(BorderFactory.createEmptyBorder(20, 0, 20, 0));

JPanel pnCentro = new JPanel();
pnCentro.setLayout(new BoxLayout(pnCentro, BoxLayout.Y_AXIS));
pnCentro.setBorder(new EmptyBorder(0, 40, 20, 40));

JPanel pnBotones = new JPanel();
JPanel pnIngresar = new JPanel();
pnIngresar.add(btIngresar);
JPanel pnMostrar = new JPanel();
pnMostrar.add(btMostrar);
pnBotones.add(pnIngresar);
pnBotones.add(pnMostrar);

JPanel pnTabla = new JPanel();
JScrollPane scrollTabla = new JScrollPane(tabla);
scrollTabla.setPreferredSize(new Dimension(200, 250));
pnTabla.add(scrollTabla);

pnCentro.add(pnBotones);
pnCentro.add(pnTabla);

setLayout(new BorderLayout());
add(pnNorte, BorderLayout.NORTH);
add(pnCentro, BorderLayout.CENTER);


setTitle("Tabla Palabras");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack();
setLocationRelativeTo(null);
setVisible(true);
}

private void iniciarComponentes() {
palabras = new ArrayList<String>();
modeloTabla = new ModeloTabla(palabras);
tabla = new MiTabla();
jtPalabra = new JTextField(12);
btIngresar = new JButton("Ingresar");
btIngresar.addActionListener(new AccionIngresar());
btMostrar = new JButton("Mostrar");
btMostrar.addActionListener(new AccionMostrar());
}

private class ModeloTabla extends AbstractTableModel {

ArrayList<String> palabras;
String[] nombreColumna = new String[]{"Palabras"};

public ModeloTabla(ArrayList<String> palabras) {
this.palabras = palabras;
}

public void actualizarTabla() {
fireTableDataChanged();
}

@Override
public String getColumnName(int col) {
return nombreColumna[col];
}

@Override
public int getRowCount() {
if (palabras == null)
return 0;
else
return palabras.size();
}

@Override
public int getColumnCount() {
return nombreColumna.length;
}

@Override
public Object getValueAt(int rowIndex, int columnIndex) {
return palabras.get(rowIndex);
}

}

private class MiTabla extends JTable {

public MiTabla() {
//Aplicamos nuestro modelo de tabla
super(modeloTabla);
//Pedimos al render que centre los textos en sus celdas.
DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer();
centerRenderer.setHorizontalAlignment(SwingConstants.CENTER);
setDefaultRenderer(Object.class, centerRenderer);
//Cambiamos alguna fuente y color para los datos de la tabla
setFont(new Font("Verdana", Font.PLAIN , 14));
setForeground(Color.BLUE);
//También cambiamos estilo de fuente a la cabecera
JTableHeader cabecera = getTableHeader();
cabecera.setFont(new Font("Verdana", Font.BOLD , 14));
}
}

private class AccionIngresar implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {

String palabra = jtPalabra.getText();
jtPalabra.setText(null);
jtPalabra.requestFocus();
if (!palabra.isEmpty() && !palabra.isBlank()) {
if (palabra.length() > 10)
JOptionPane.showMessageDialog(null, "La palabra no puede superar 10 caracteres",
"Ingresar Palabra", JOptionPane.WARNING_MESSAGE);
else
palabras.add(palabra);
}
else
JOptionPane.showMessageDialog(null, "¡Ha de ingresar una palabra!",
"Ingresar Palabra", JOptionPane.WARNING_MESSAGE);
}
}

private class AccionMostrar implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
modeloTabla.actualizarTabla();

}
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
try {
new TablaPalabras();
}
catch(Exception e) {
e.printStackTrace();
}
}
});
}
}
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: 724
    • Ver Perfil
Re: ayuda con ejercicios de java swing
« Respuesta #5 en: 22 de Noviembre 2020, 03:38 »
Me faltaba el quinto ejercicio.
Se me ha ocurrido hacer que cada posible respuesta, sea un panel que reciba el botón que ha de mostrar y un booleano para establecer un atributo que indique si esa respuesta es correcta o no lo es, cuando el usuario la marque.

De este modo, cada botón/opción es capaz de informar por si solo si es válido o no.

Como hay dos tipos de botones en el cuestionario, JRadioButton y JCheckBox, y necesito que este panel pueda construirse con ambos tipos, en el constructor pido recibir un JToggleButton, que es la clase "madre" de estos botones, que son "hermanos".
Así gracias al polimorfismo (aplicar POO es crucial en todo) no tengo que escribir esta clase dos veces, una para cada tipo de botón. Me basta con una.

Código: [Seleccionar]
private class PanelRespuesta extends JPanel {

private boolean esCorrecta;
private JToggleButton boton;
/*
* JToggleButton es un "ancestro" de JcheckBox
*  y de JRadioButton.
*  Así este panel se puede construir con ambos elementos
*/

public PanelRespuesta(JToggleButton comp, boolean correcta) {
boton = comp;
esCorrecta = correcta; //En el constructor establecemos si es respuesta correcta o no
setLayout(new FlowLayout(FlowLayout.LEFT));
add(boton);
setBorder(BorderFactory.createLoweredBevelBorder());
}

}

Cada pregunta tiene una serie de respuestas a elegir, por tanto, voy a crear otra clase que agrupe los paneles respuesta asociados a una pregunta en concreto.
Así las respuestas de una misma pregunta están relacionadas. Además les asocio el JLabel que mostrará si se ha acertado o no la respuesta correcta.

Esta clase tendrá un método muy importante. Será el método que compruebe si se ha escogido la respuesta correcta.
La comprobación será distinta dependiendo de si se trata un botón radio o un checkbox, ya que en este último se permite la selección multiple. Así que no habrá solo una respuesta correcta, pueden haber varias y hay que comprobar que estén todas marcadas para indicar que la respuesta es correcta.

Este método lo he hecho boolean para que, a parte de comprobar si es correcta y actualizar el JLabel de "valor, quiero que informe de si el usuario ha elegido algo en esa serie de respuestas o no.
Si no ha seleccionado nada, quiero saberlo para lanzar un mensaje de advertencia en pantalla.
Código: [Seleccionar]
private class SerieRespuestas{

private PanelRespuesta[] respuestas;
private JLabel valor;

public SerieRespuestas(PanelRespuesta[] resp) {

respuestas = resp;
valor = new JLabel("Valor");
valor.setFont(new Font("Verdana", Font.BOLD, 14));

//Si son botones radio, los agrupamos
if (respuestas[0].boton instanceof JRadioButton) {
ButtonGroup grupo = new ButtonGroup();
for (int i = 0; i < respuestas.length; i++)
grupo.add(respuestas[i].boton);
}
}

/**
* Comprueba si ha habido respuesta seleccionada, y si es correcta.
* La etiqueta valor indicará el resultado, si es que se ha seleccionado algo.
* El metodo informa con  true/false si ha habido alguna seleccion o no,
* para saberlo y poder mostrar un mensaje al usuario.
*
* @return True si ha habido selección (da igual si correcta o no),
* False si no se ha marcado ninguna respuesta.
*/
public boolean comprobarRespuesta() {

boolean haySeleccion = false; //Controlar si se ha seleccionado algo
boolean acertada = false; //Controla si la selección es correcta

/*
* Comprobar las respuestas es distinto si las respuestas son
* JRadioButton (solo una posible seleccion)
* o si son JCheckBox (varias selecciones posibles)
*/
if (respuestas[0].boton instanceof JRadioButton) {
for (PanelRespuesta respuesta: respuestas) {
if (respuesta.boton.isSelected()) {
haySeleccion = true;
acertada = respuesta.esCorrecta;
}
}
}
else { //Son JCheckBox
/*
* Empezamos considerandola como acertada.
* Se considerará erronea si:
* - Encontramos una respuesta correcta que NO esta seleccionada
* - Encontramos una respuesta seleccionadao que NO es correcta.
*/
acertada = true;
for (PanelRespuesta respuesta: respuestas) {

if (respuesta.esCorrecta && !respuesta.boton.isSelected())
acertada = false;

if (respuesta.boton.isSelected()) {
haySeleccion = true;
if (!respuesta.esCorrecta)
acertada = false;
}
}
}

//Actualizamos etiqueta valor, si es que ha habido seleccion
if (haySeleccion) {
if (acertada) {
valor.setText("Cierto");
valor.setForeground(Color.BLUE);
}
else {
valor.setText("Error");
valor.setForeground(Color.RED);
}
}

return haySeleccion; //Acertada o no, informamos si el usuario ha seleccionado algo
}
}

Una vez tenemos una clase que agrupa las respuestas de una misma pregunta, necesito otra clase que maquete un panel con las series de respuestas.
Esta clase va a hacer el trabajo "pesado" al iniciar el programa.
Va a crear todos los "paneles-respuesta", los agrupará en distintas "series" y ya entonces los maquetará en el panel.
Para que quede todo más o menos alineado, usaré un GridLayout.

Además tiene un método que al invocarlo, se recorren todas las "series de respuestas" para que estas comprueben si se ha seleccionado alguna respuesta, y si además son correctas.
Si alguna "serie" informa de que el usuario no ha elegido ninguna respuesta, será cuando se muestre el mensaje de advertencia

Código: [Seleccionar]
private class PanelRespuestas extends JPanel {

private SerieRespuestas[] series;

public PanelRespuestas() {
//construiremos todas las series respuestas
series = new SerieRespuestas[4];
//1era serie de respuestas
PanelRespuesta[] serie1 = new PanelRespuesta[4];
serie1[0] = new PanelRespuesta(new JRadioButton("58"), false);
serie1[1] = new PanelRespuesta(new JRadioButton("34"), false);
serie1[2] = new PanelRespuesta(new JRadioButton("31"), true);
serie1[3] = new PanelRespuesta(new JRadioButton("40"), false);
//2da serie
PanelRespuesta[] serie2 = new PanelRespuesta[4];
serie2[0] = new PanelRespuesta(new JRadioButton("Marte"), false);
serie2[1] = new PanelRespuesta(new JRadioButton("Jupiter"), true);
serie2[2] = new PanelRespuesta(new JRadioButton("Tierra"), false);
serie2[3] = new PanelRespuesta(new JRadioButton("Saturno"), false);
//3ra serie
PanelRespuesta[] serie3 = new PanelRespuesta[4];
serie3[0] = new PanelRespuesta(new JRadioButton("ola"), false);
serie3[1] = new PanelRespuesta(new JRadioButton("desición"), true);
serie3[2] = new PanelRespuesta(new JRadioButton("hay"), false);
serie3[3] = new PanelRespuesta(new JRadioButton("ahí"), false);
//4ta serie
PanelRespuesta[] serie4 = new PanelRespuesta[4];
serie4[0] = new PanelRespuesta(new JCheckBox("Sagaz"), true);
serie4[1] = new PanelRespuesta(new JCheckBox("Listo"), true);
serie4[2] = new PanelRespuesta(new JCheckBox("Lerdo"), false);
serie4[3] = new PanelRespuesta(new JCheckBox("Astuto"), true);

//Agrupamos las series en el array
series[0] = new SerieRespuestas(serie1);
series[1] = new SerieRespuestas(serie2);
series[2] = new SerieRespuestas(serie3);
series[3] = new SerieRespuestas(serie4);
//Listo, maquetamos el panel
setLayout(new GridLayout(4, 5));
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++)
add(series[i].respuestas[j]);
JPanel pnValor = new JPanel();
pnValor.add(series[i].valor);
//pnValor.setBorder(BorderFactory.createLoweredBevelBorder());
pnValor.setBorder(BorderFactory.createEtchedBorder());
add(pnValor);
}
}

public void comprobarValores() {
boolean todasSeleccionadas = true;
for (SerieRespuestas serie: series)
if (!serie.comprobarRespuesta())
todasSeleccionadas = false;

if (!todasSeleccionadas)
JOptionPane.showMessageDialog(null, "Hay preguntas sin contestar",
"Comprobar respuestas", JOptionPane.WARNING_MESSAGE);
}

}

Ya tenemos un panel con todas las respuestas agrupadas y maquetadas. Y con el código necesario para comprobar por ellas mismas si se ha elegido la correcta.

Falta otro panel con las preguntas. Este será muy sencillo:
Código: [Seleccionar]
private class PanelPreguntas extends JPanel {

public PanelPreguntas() {
setLayout(new GridLayout(4,1,5,10));
FlowLayout fluyeIzq = new FlowLayout(FlowLayout.RIGHT);
JPanel preg1 = new JPanel(fluyeIzq);
preg1.add(new JLabel("4 * 6 + 3 + 2 * 2 = "));
JPanel preg2 = new JPanel(fluyeIzq);
preg2.add(new JLabel("Nombre del quinto planeta:"));
JPanel preg3 = new JPanel(fluyeIzq);
preg3.add(new JLabel("Palabra con error ortográfico:"));
JPanel preg4 = new JPanel(fluyeIzq);
preg4.add(new JLabel("Sinómimos de inteligente:"));
add(preg1);
add(preg2);
add(preg3);
add(preg4);
}
}

Y ya está. En el JFrame principal juntaremos ambos paneles y añadiremos otro en la parte inferior con el botón "mostrar".
La acción de este botón es muy sencilla y se la he declarado "en línea" en el constructor, pues todo lo que tiene que hacer es pedirle al panel de respuestas que invoque el método que revisa las series de respuestas.
Así que para una sola línea no he creado un clase ActionListener a parte como sí hice en los ejercicios anteriores.

Dejo a continuación el código completo.


Código: [Seleccionar]
public class Preguntas extends JFrame{

private PanelPreguntas pnPreguntas;
private PanelRespuestas pnRespuestas;
private JButton btMostrar;

public Preguntas() {

pnPreguntas = new PanelPreguntas();
pnRespuestas = new PanelRespuestas();
btMostrar = new JButton("Mostrar");
btMostrar.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
pnRespuestas.comprobarValores();
}
});

setLayout(new BorderLayout());
JPanel pnCentro = new JPanel();
pnCentro.add(pnPreguntas);
pnCentro.add(pnRespuestas);
add(pnCentro, BorderLayout.CENTER);
JPanel pnSur = new JPanel();
pnSur.add(btMostrar);
add(pnSur, BorderLayout.SOUTH);

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


/**
* Modela un pequeño panel que simplemente contendrá
* un JCheckBox o un JRadioButton, siendo una respuesta escogible
* por el usuario.
* Un atributo boolean indicará si es una respuesta correcta o incorrecta.
*/
private class PanelRespuesta extends JPanel {

private boolean esCorrecta;
private JToggleButton boton;
/*
* JToggleButton es un "ancestro" de JcheckBox
*  y de JRadioButton.
*  Así este panel se puede construir con ambos elementos
*/

public PanelRespuesta(JToggleButton comp, boolean correcta) {
boton = comp;
esCorrecta = correcta; //En el constructor establecemos si es respuesta correcta o no
setLayout(new FlowLayout(FlowLayout.LEFT));
add(boton);
setBorder(BorderFactory.createLoweredBevelBorder());
}

}

/**
* Esta clase agrupa toda una serie de respuestas asociada
* a una pregunta, y añade la etiqueta de "valor" que informa
* cuando la respuesta ha sido correcta o no.
* Incorpora un método para comprobar si se ha seleccionado
* respuesta correcta
*/
private class SerieRespuestas{

private PanelRespuesta[] respuestas;
private JLabel valor;

public SerieRespuestas(PanelRespuesta[] resp) {

respuestas = resp;
valor = new JLabel("Valor");
valor.setFont(new Font("Verdana", Font.BOLD, 14));

//Si son botones radio, los agrupamos
if (respuestas[0].boton instanceof JRadioButton) {
ButtonGroup grupo = new ButtonGroup();
for (int i = 0; i < respuestas.length; i++)
grupo.add(respuestas[i].boton);
}
}

/**
* Comprueba si ha habido respuesta seleccionada, y si es correcta.
* La etiqueta valor indicará el resultado, si es que se ha seleccionado algo.
* El metodo informa con  true/false si ha habido alguna seleccion o no,
* para saberlo y poder mostrar un mensaje al usuario.
*
* @return True si ha habido selección (da igual si correcta o no),
* False si no se ha marcado ninguna respuesta.
*/
public boolean comprobarRespuesta() {

boolean haySeleccion = false; //Controlar si se ha seleccionado algo
boolean acertada = false; //Controla si la selección es correcta

/*
* Comprobar las respuestas es distinto si las respuestas son
* JRadioButton (solo una posible seleccion)
* o si son JCheckBox (varias selecciones posibles)
*/
if (respuestas[0].boton instanceof JRadioButton) {
for (PanelRespuesta respuesta: respuestas) {
if (respuesta.boton.isSelected()) {
haySeleccion = true;
acertada = respuesta.esCorrecta;
}
}
}
else { //Son JCheckBox
/*
* Empezamos considerandola como acertada.
* Se considerará erronea si:
* - Encontramos una respuesta correcta que NO esta seleccionada
* - Encontramos una respuesta seleccionadao que NO es correcta.
*/
acertada = true;
for (PanelRespuesta respuesta: respuestas) {

if (respuesta.esCorrecta && !respuesta.boton.isSelected())
acertada = false;

if (respuesta.boton.isSelected()) {
haySeleccion = true;
if (!respuesta.esCorrecta)
acertada = false;
}
}
}

//Actualizamos etiqueta valor, si es que ha habido seleccion
if (haySeleccion) {
if (acertada) {
valor.setText("Cierto");
valor.setForeground(Color.BLUE);
}
else {
valor.setText("Error");
valor.setForeground(Color.RED);
}
}

return haySeleccion; //Acertada o no, informamos si el usuario ha seleccionado algo
}
}

/**
* Este panel contendrá todas las series de respuestas
*/
private class PanelRespuestas extends JPanel {

private SerieRespuestas[] series;

public PanelRespuestas() {
//construiremos todas las series respuestas
series = new SerieRespuestas[4];
//1era serie de respuestas
PanelRespuesta[] serie1 = new PanelRespuesta[4];
serie1[0] = new PanelRespuesta(new JRadioButton("58"), false);
serie1[1] = new PanelRespuesta(new JRadioButton("34"), false);
serie1[2] = new PanelRespuesta(new JRadioButton("31"), true);
serie1[3] = new PanelRespuesta(new JRadioButton("40"), false);
//2da serie
PanelRespuesta[] serie2 = new PanelRespuesta[4];
serie2[0] = new PanelRespuesta(new JRadioButton("Marte"), false);
serie2[1] = new PanelRespuesta(new JRadioButton("Jupiter"), true);
serie2[2] = new PanelRespuesta(new JRadioButton("Tierra"), false);
serie2[3] = new PanelRespuesta(new JRadioButton("Saturno"), false);
//3ra serie
PanelRespuesta[] serie3 = new PanelRespuesta[4];
serie3[0] = new PanelRespuesta(new JRadioButton("ola"), false);
serie3[1] = new PanelRespuesta(new JRadioButton("desición"), true);
serie3[2] = new PanelRespuesta(new JRadioButton("hay"), false);
serie3[3] = new PanelRespuesta(new JRadioButton("ahí"), false);
//4ta serie
PanelRespuesta[] serie4 = new PanelRespuesta[4];
serie4[0] = new PanelRespuesta(new JCheckBox("Sagaz"), true);
serie4[1] = new PanelRespuesta(new JCheckBox("Listo"), true);
serie4[2] = new PanelRespuesta(new JCheckBox("Lerdo"), false);
serie4[3] = new PanelRespuesta(new JCheckBox("Astuto"), true);

//Agrupamos las series en el array
series[0] = new SerieRespuestas(serie1);
series[1] = new SerieRespuestas(serie2);
series[2] = new SerieRespuestas(serie3);
series[3] = new SerieRespuestas(serie4);
//Listo, maquetamos el panel
setLayout(new GridLayout(4, 5));
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++)
add(series[i].respuestas[j]);
JPanel pnValor = new JPanel();
pnValor.add(series[i].valor);
//pnValor.setBorder(BorderFactory.createLoweredBevelBorder());
pnValor.setBorder(BorderFactory.createEtchedBorder());
add(pnValor);
}
}

public void comprobarValores() {
boolean todasSeleccionadas = true;
for (SerieRespuestas serie: series)
if (!serie.comprobarRespuesta())
todasSeleccionadas = false;

if (!todasSeleccionadas)
JOptionPane.showMessageDialog(null, "Hay preguntas sin contestar",
"Comprobar respuestas", JOptionPane.WARNING_MESSAGE);
}

}

private class PanelPreguntas extends JPanel {

public PanelPreguntas() {
setLayout(new GridLayout(4,1,5,10));
FlowLayout fluyeIzq = new FlowLayout(FlowLayout.RIGHT);
JPanel preg1 = new JPanel(fluyeIzq);
preg1.add(new JLabel("4 * 6 + 3 + 2 * 2 = "));
JPanel preg2 = new JPanel(fluyeIzq);
preg2.add(new JLabel("Nombre del quinto planeta:"));
JPanel preg3 = new JPanel(fluyeIzq);
preg3.add(new JLabel("Palabra con error ortográfico:"));
JPanel preg4 = new JPanel(fluyeIzq);
preg4.add(new JLabel("Sinómimos de inteligente:"));
add(preg1);
add(preg2);
add(preg3);
add(preg4);
}
}

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

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".