Autor Tema: Como puedo leer pregunta y Respuesta de JRadioButton Java encuesta con swing  (Leído 4790 veces)

Olivares94

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 1
    • Ver Perfil
Hola que tal, por favor si alguien me pudiera ayudar para la lectura de pregunta y respuesta que se guarda en un txt, ya que he intentado hacer lo siguiente pero al parecer no estoy bien.
De antemano les agradezco su ayuda!


Código: [Seleccionar]
class Encuesta extends JFrame {
            JLabel p1, p2, p3, pp, ppp, p4, p5;
            JCheckBoxMenuItem y1, n1, y2, n2, y3, n3, y4, n4, y5, n5;
            JButton send, salir;
            JPanel who;
            public Encuesta() {
                setLayout(null);
                setBounds(300, 190, 430, 440);
                setTitle("Encuesta");
                who = new JPanel();
                who.setBackground(Color.LIGHT_GRAY);
                p1 = new JLabel("1.¿Ha leído folletos informativos respecto a la Donación de Sangre?");
                p1.setFont(new Font("Berlin Sans FB", Font.PLAIN, 14));
                p1.setBounds(05, 05, 500, 15);
                add(p1);
                y1 = new JCheckBoxMenuItem("Si");
                y1.setBounds(50, 25, 40, 15);
                y1.setVisible(true);
                n1 = new JCheckBoxMenuItem("No");
                n1.setBounds(100, 25, 40, 15);
                n1.setVisible(true);
                add(y1);
                add(n1);
                p2 = new JLabel("2.¿Ha donado sangre, plaquetas o plasma en los últimos 3 años?");
                p2.setFont(new Font("Berlin Sans FB", Font.PLAIN, 14));
                p2.setBounds(05, 65, 500, 15);
                add(p2);
                y2 = new JCheckBoxMenuItem("Si");
                y2.setBounds(50, 85, 40, 15);
                y2.setVisible(true);
                n2 = new JCheckBoxMenuItem("No");
                n2.setBounds(100, 85, 40, 15);
                n2.setVisible(true);
                add(y2);
                add(n2);
                p3 = new JLabel("3.¿En los últimos 12 meses se ha realizado tatuajes, perforaciones, ");
                p3.setFont(new Font("Berlin Sans FB", Font.PLAIN, 14));
                p3.setBounds(05, 125, 500, 15);
                add(p3);
                pp = new JLabel("acupuntura, transfusiones, cateterismos, endoscopias o ha tenido ");
                pp.setBounds(05, 145, 500, 15);
                pp.setFont(new Font("Berlin Sans FB", Font.PLAIN, 14));
                add(pp);
                ppp = new JLabel("contacto sexual con desconocidos?");
                ppp.setBounds(05, 165, 500, 15);
                ppp.setFont(new Font("Berlin Sans FB", Font.PLAIN, 14));
                add(ppp);
                y3 = new JCheckBoxMenuItem("Si");
                y3.setBounds(50, 185, 40, 15);
                y3.setVisible(true);
                n3 = new JCheckBoxMenuItem("No");
                n3.setBounds(100, 185, 40, 15);
                n3.setVisible(true);
                add(y3);
                add(n3);
                p4 = new JLabel("4.¿Ha recibido algún transplante de órgano en los últimos 6 meses?");
                p4.setFont(new Font("Berlin Sans FB", Font.PLAIN, 14));
                p4.setBounds(05, 235, 500, 15);
                add(p4);
                y4 = new JCheckBoxMenuItem("Si");
                y4.setBounds(50, 250, 40, 15);
                y4.setVisible(true);
                n4 = new JCheckBoxMenuItem("No");
                n4.setBounds(100, 250, 40, 15);
                n4.setVisible(true);
                add(y4);
                add(n4);
                p5 = new JLabel("5.¿Ha viajado en los últimos 28 dias a zonas con brotes epidemiológicos?");
                p5.setFont(new Font("Berlin Sans FB", Font.PLAIN, 14));
                p5.setBounds(05, 305, 500, 15);
                add(p5);
                y5 = new JCheckBoxMenuItem("Si");
                y5.setBounds(50, 320, 40, 15);
                y5.setVisible(true);
                n5 = new JCheckBoxMenuItem("No");
                n5.setBounds(100, 320, 40, 15);
                n5.setVisible(true);
                add(y5);
                add(n5);
                send = new JButton("Enviar");
                send.setBounds(60, 360, 80, 20);
                send.setFont(new Font("Berlin Sans FB", Font.PLAIN, 14));
                add(send);
                salir = new JButton("Salir");
                salir.setBounds(240, 360, 80, 20);
                salir.setFont(new Font("Berlin Sans FB", Font.PLAIN, 14));
                add(salir);
                send.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent ae) {
                        String us = u.getText();
                        String P1 = p1.getText();
                        String P2 = p2.getText();
                        String P3 = p3.getText();
                        String P31 = pp.getText();
                        String P32 = ppp.getText();
                        String P4 = p4.getText();
                        String P5 = p5.getText();
                        String P = "Si";
                        String R = "No";
                        if (us.equals(u) ){
                            JOptionPane.showMessageDialog(null, "Por Favor, conteste todas las preguntas");
                            if (P1.equals("") == y1.isSelected()){
                                P += "Si";
                            }
                            if (P1.equals("") == n1.isSelected()){
                                R += "No";
                            }
                            if (P2.equals("") == y2.isSelected()){
                                P += "Si";
                            }
                            if (P2.equals("") == n2.isSelected()){
                                R += "No";
                            }
                            if (P32.equals("") == y3.isSelected()){
                                P += "Si";
                            }
                            if (P32.equals("") == n3.isSelected()){
                                R += "No";
                            }
                            if (P4.equals("") == y4.isSelected()){
                                P += "Si";
                            }
                            if (P4.equals("") == n4.isSelected()){
                                R += "No";
                            }
                            if (P5.equals("") == y5.isSelected()){
                                P += "Si";
                            }
                            if (P5.equals("") == n5.isSelected()){
                                R += "No";
                            }
                        } else {
                            archivoenc();
                        }
                    }
                }
« Última modificación: 18 de Agosto 2018, 22:21 por Alex Rodríguez »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 988
    • Ver Perfil
Re:Como puedo leer pregunta y Respuesta de un JRadioButton
« Respuesta #1 en: 29 de Julio 2018, 02:07 »
Hola
Intento compilar y encuentro algunos errores.
Pero sobre todo hay cosas muy raras en el evento del boton Send:

Citar
@Override
                    public void actionPerformed(ActionEvent ae) {
                        String us = u.getText(); <--¿Que es u?No esta declarado en ningun sitio
                        String P1 = p1.getText();<-- p1, p2, p3... son JLabel, las etiquetas
                        String P2 = p2.getText();      donde has escrito el enunciado de las preguntas.
                        String P3 = p3.getText();      ¿Para que quieres recuperar los enunciados y pasarlos a objetos String?
                        String P31 = pp.getText();
                        String P32 = ppp.getText();
                        String P4 = p4.getText();
                        String P5 = p5.getText();
                        String P = "Si";
                        String R = "No";
                        if (us.equals(u) ){<--Sea lo que sea u, esta condición no parece tener mucho sentido.Habria que pensar mejor que condicion nos interesa comprobar si se cumple o no
                            JOptionPane.showMessageDialog(null, "Por Favor, conteste todas las preguntas");
                            if (P1.equals("") == y1.isSelected()){
                                P += "Si";
                            }
etc.....

Más cosas:
- los add() que haces, al no indicar nada, los estás añadiendo al JFrame principal, no al JPanel who que has declarado.
Si quieres añadirlo al JPanel, has de poner who.add()

Y finalmente añadir este JPanel al JFrame principal con:
add(who);

A parte hay que hacer visible al JFrame una vez terminado todo y un par de cosas más para que se cierre cuando pulsemos el boton X para Cerrar Ventana.

- Los JCheckBoxMenuItem, son elementos para añadir a las barras de menú superiores de las ventanas. Son los típicos elementos que se despliegan en todas las aplicaciones cuando apretamos en Archivo, Editar, Ayuda...
Esto no te sirve para lo que quieres hacer, habría que usar JRadioButton tal y como indicas en el enunciado, sin embargo, no hay ninguno en tu código.

-Prescindes de usar ningún layout y prefieres establecer tú las posiciones con setBounds().
Esto es válido, pero no muy recomendable ya que al mover o ampliar la ventana de aplicación los elementos pueden acabar desordenándose.
¿Es necesario hacerlo así? Creo que combinando uno o dos layout puede quedar mejor y sin tener que preocuparse de establecer posiciones con setBound()

Ahora me es imposible dedicarle a esto tiempo (Son las 2 de la noche por aquí..)
Si encuentro tiempo en las próximas horas, voy a intentar yo hacer el diseño de este marco para luego poder explicartelo mucho mejor.
Luego con esas explicaciones, ya puedes hacer tú el diseño a tu gusto y necesidades.

Despues de todo eso, tocaremos otro tema, que es cómo han de guardarse los resultados en el archivo de texto.
Porque veo que tienes dos String P y R a los que les vas añadiendo "Si" a uno y "No" al otro según lo que responda el usuario.
Y eso, si lo escribimos en un txt, tendríamos algo así como:
Código: [Seleccionar]
SiSiSi
NoNo

Vale que es un ejercicio de práctica y aprendizaje, pero lo que guardemos en el txt debería tener algo de sentido, que de algún modo supieramos a que pregunta corresponde cada Si y cada No.
Pero eso ya se verá luego. Primero intentaremos ver si conseguimos diseñar un formulario de preguntas y luego le añadiremos funcionalidad.
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:Como puedo leer pregunta y Respuesta de un JRadioButton
« Respuesta #2 en: 29 de Julio 2018, 19:58 »
Hola de nuevo. Te explico mi propuesta.
Para facilitar la creación de la encuesta, y que sea más fácil leer el código, etc... lo ideal es hacer uso de las ventajas de la Programacion Orientada a Objetos(POO)
Así que he pensado en crear una clase llamada Pregunta con una etiqueta JLabel para el enunciado y dos RadioButon con los valores "Si" y "No".
Esta clase hereda de JPanel, es decir, por cada pregunta que vayamos a crear, obtendremos un panel que podremos ir añadiendo a la clase principal donde crearemos el marco JFrame.
Así, desde el JFrame, podemos crear facilmente objetos de la clase Pregunta, tan solo habrá que pasarles el texto que queremos que tenga el enunciado y listo.
Ya no habrá que crear decenas de radioButton, decenas de JLabel... tan solo instanciar objetos de la clase Pregunta pasandoles un texto para el enunciado

Esta es la clase Pregunta
Código: [Seleccionar]
import java.awt.Font;

import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.ButtonGroup;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.border.EtchedBorder;

public final class Pregunta extends JPanel{

private JLabel enunciado;
private JRadioButton radioSi, radioNo;

public Pregunta(String enun) {
//Inicializamos componentes
enunciado = new JLabel(enun);
enunciado.setFont(new Font("Berlin Sans FB", Font.PLAIN, 14));
radioSi = new JRadioButton("Si");
radioNo = new JRadioButton("No");
radioSi.setFont(new Font("Berlin Sans FB", Font.BOLD, 14));
radioNo.setFont(new Font("Berlin Sans FB", Font.BOLD, 14));
//Opcionalmente, podemos añadir un borde a cada Pregunta
setBorder(BorderFactory.createEtchedBorder(EtchedBorder.LOWERED));
/*
* Organizamos el layout.
* Usaremos dos subpaneles colocados en vertical con un BoxLayout para el panel principal.
* Cada subpanel a su vez usarán el FlowLayout que tienen activado por defecto.
* El subpanel de arriba tendrá el enunciado de la pregunta
* El subpanel de abajo tendrá los radioButton.
*/
//SubPanel arriba
JPanel arriba = new JPanel();
arriba.add(enunciado);
//SubPanel abajo
JPanel abajo = new JPanel();
abajo.add(radioSi);
abajo.add(radioNo);
//Panel principal
setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));//decimos que "ESTE panel" (nuestra clase hereda de JPanel) organiza los componentes de arriba a abajo
add(arriba);
add(abajo);
}

/**
* Nos indica que respuesta ha sido seleccionada devolviendo una cadena
* con "Si" o con "No".
* Si no hay ninguna seleccionada, devolverá null
* @return String con valores "Si", "No" o null
*/
public String getRespuesta() {
if (radioSi.isSelected())
return "Si";
else if (radioNo.isSelected())
return "No";
else
return null;
}

}

Como ves, el constructor tiene como argumento un String donde recibirá el enunciado para la pregunta.

Los RadioButton son fáciles de usar. Tan solo hay que instanciarlos indicándoles que texto queremos que muestren y luego añadirlos al panel que nos interese.

Para la organización de los componentes en pantalla, en lugar de "nullear" el gestor de layout y pelearnos poniendo valores absolutos con el setBounds(), es más cómodo combinar paneles cada uno con el layout que nos interese.
Yo he preferido diseñarlo de modo que el enunciado este arriba y debajo los dos radioButton uno al lado del otro. Todo lo más centrado posible.
Para conseguir centrarlo, lo que hago es crear dos subpaneles llamados arriba y abajo.
Ambos conservan el gestor layout que traen por defecto, que es un FLowLayout desde el centro, es decir, los componentes que añadamos se irán centrando.
Entonces, a arriba le pongo el JLabel con el enunciado.
Y a abajo le pongo los dos radioButton.

Luego, al panel principal (que es el que hereda nuestra clase Pregunta de JPanel) sí le cambio el gestor de layout por un BoxLayout.
BoxLayout agrupa los componentes como si fueran cajas (box = caja). Los puede agrupar en horizontal o en vertical según le indiquemos.
Yo le indico que lo haga en vertical en esta linea:
Código: [Seleccionar]
setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));De este modo, cuando al panel principal yo le añada los subpaneles arriba y abajo, el primero quedará por encima del otro y estos a su vez conservan sus componentes centrados con su propio FlowLayout.

Y con esto ya tenemos explicado la parte visual de la clase Pregunta.
Pero ahora nos falta la parte lógica.
Y esta es muy sencilla. La unica lógica que esperamos de una Pregunta, es que nos pueda decir cuál de las dos posibles respuestas es la que está marcada, o si tal vez no se ha marcado ninguna todavía.
Para esto tan solo necesitamos un metodo tan sencillo como este:
Código: [Seleccionar]
public String getRespuesta() {
if (radioSi.isSelected())
return "Si";
else if (radioNo.isSelected())
return "No";
else
return null;
}
Casi no hay ni que explicarlo.
Si el radiobutton llamado radioSi (muy importante usar nombres descriptivos para nuestras variables, componentes, etc...) está marcado, nos devuelve una cadena String con el texto "Si.
Si el que está marcado es radioNo, nos devuelve "No".
Si no hay ninguna respuesta marcada, nos devolverá el valor null

Esto luego, en la clase principal, nos será muy util para comprobar si el usuario ha marcado respuestas en todas las Preguntas, y saber cuáles son esas respuestas.

Y con esto ya está explicada la clase Pregunta. Pasamos a un post nuevo para explicar la clase principal Encuesta
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:Como puedo leer pregunta y Respuesta de un JRadioButton
« Respuesta #3 en: 29 de Julio 2018, 20:58 »
AHora vamos a ver la clase principal llamada Encuesta
Esta clase es la que dibujará el marco principal, por lo tanto hereda de JFrame tal como ya hiciste en tu código.
Este marco irá apilando objetos de nuestra clase Pregunta (recordemos que cada Pregunta es un JPanel), uno encima de otro. Por lo tanto también usaremos un BoxLayout vertical para la organizacion visual.
El ultimo panel que tendrá abajo de todo, no será una Pregunta sino un JPanel con los dos botones de "Enviar" y "Salir"

Para poder gestionar fácilmente las Preguntas que vamos a crear, las debemos agrupar en algún tipo de colección, al menos en un arreglo, pero yo he preferido usar un ArrayList.
Al tenerlas todas agrupadas en una coleccion, luego mediante bucles podemos recorrer las Preguntas una a una para ir añadiendolas al marco principal, o para preguntarles que respuestas tienen marcadas cada una, o para lo que necesitemos...

Así que esta clase tan solo tendrá tres atributos: el ArrayList con los objetos Pregunta y los dos botones JButton.

El constructor lo primero que hace es poner nombre al marco y justo después llama a un método que es el que se encarga de crear las Preguntas. Esto podría haberlo escrito directamente en el constructor, pero para que sea todo más legible, esta parte he preferido escribirla en un método separado.
Este método es muy sencillo, lo que hace es crear preguntas, con el enunciado deseado y los va añadiendo al ArrayList que se llama listaPreguntas
Código: [Seleccionar]
private void inicializarListaPreguntas() {
listaPreguntas.add(new Pregunta("1.¿Ha leído folletos informativos respecto a la Donación de Sangre?"));
listaPreguntas.add(new Pregunta("2.¿Ha donado sangre, plaquetas o plasma en los últimos 3 años?"));
/*
* Debido a la longitud de la pregunta 3, usamos codigo HTML dentro del JLabel para conseguir saltos de
* linea perfectamente centrados todo dentro de una unica etiqueta JLabel.
* Esto es gracias a que muchos componentes Swing soportan un HTML basico
*/
listaPreguntas.add(new Pregunta("<html><body><span align='center'>3.¿En los últimos 12 meses se ha realizado tatuajes, perforaciones,</span<br>"
+ "<span align='center'>acupuntura, transfusiones, cateterismos, endoscopias o ha tenido</span><br>"
+ "<span align='center'>contacto sexual con desconocidos?</span></body></html>"));
listaPreguntas.add(new Pregunta("4.¿Ha recibido algún transplante de órgano en los últimos 6 meses?"));
listaPreguntas.add(new Pregunta("5.¿Ha viajado en los últimos 28 dias a zonas con brotes epidemiológicos?"));
}

Una curiosidad es lo que ocurre con la pregunta numero 3. Su enunciado es mucho más largo que las de las otras preguntas. Si todo ese texto lo dejamos en una sola linea, nos deja una ventana un poco fea. Ya que es muy ancha para poder albergar toda esa linea, pero luego el resto de preguntas quedan un poco ridiculas con tan poco texto para tanta ventana.
Para evitar esto, lo ideal es añadir saltos de linea para partirla en tres lineas en lugar de solo una.
Pero, hay un problema. A un JLabel no puedes ponerle saltos de lineas -->(\n)
Se podría solventar usando tres JLabel en luga de uno, pero hemos diseñado nuestra clase Pregunta para que solo tenga un JLabel y no vamos a diseñar una nueva clase especificamente para esta Pregunta tan especial...
¿Como solucionarlo?
Pues con un truquito que a veces viene de maravilla para estas situaciones. Resulta que dentro del JLabel podemos usar codigo HTML a nivel básico, más que suficiente para crear saltos de linea y hacer que las tres lineas tengan el texto centrado.
Todo ello dentro de un único JLabel.

EL resto de preguntas no presentan problema, instanciamos un objeto Pregunta, le pasamos el enunciado y lo añadimos al ArrayList.

Fíjate que fácil nos pone esto las cosas. Aquí podríamos hacer 10 preguntas, 50, 100, 5000....las que quisieramos... sin tener que declarar cientos de RadioButton y etiquetas JLabel especificas para cada pregunta que quisieramos poner en la encuesta.
Valiéndonos de las ventajas de la Programacion Orientada a Objetos (POO), simplemente hemos necesitado diseñar una sencilla clase llamada Pregunta y ahora podemos replicarla tantas veces como queramos y gestionarlas fácilmente desde un ArrayList.

Una vez inicialiadas las Preguntas, ya cada una con su propio enunciado.
Inicializamos los botones send y salir. Les ponemos un texto, una fuente a nuestro gusto y les añadimos  un ActionListener para indicarles que ha de hacer cada boton.
Código: [Seleccionar]
send = new JButton("Enviar");
send.setFont(new Font("Berlin Sans FB", Font.PLAIN, 14));
send.addActionListener(new AccionEnviar());
salir = new JButton("Salir");
salir.setFont(new Font("Berlin Sans FB", Font.PLAIN, 14));
salir.addActionListener(new AccionSalir());
De nuevo, para no hacer un código de dificil lectura, las acciones de los ActionListener las he declarado como clases separadas. Así el constructor no está saturado de lineas de código.

Estas clases están declaradas dentro de la propia clase Encuesta (es lo que se llama anidar clases) y tienen el siguiente codigo.
La del boton salir es fácil, ocultar el marco y dar orden de eliminarlo con dispose()
Código: [Seleccionar]
class AccionSalir implements ActionListener {

@Override
public void actionPerformed(ActionEvent arg0) {
setVisible(false);
dispose();
}
}

La del boton enviar tampoco es complicada.
Eso sí, se supone que este boton ha de escribir las respuestas en un fichero de texto. Esto de momento no lo he hecho. Primero centrémonos en que nos quede claro como hemos creado y organizado la encuesta, y luego nos ponemos con como queremos escribir la informacion en el archivo texto.

Esta clase lo que hace es recorrer las Preguntas una a una (bendito ArrayList) pregunta que respuesta hay marcada y las va juntando en unico String que luego mostraremos en un ventana pop-up.
Además comprueba si alguna de las Preguntas responde con un null.
Esto significa que el usuario se ha olvidado de marcar alguna respuesta. En este caso, lo que le mostramos al usuario es una advertencia indicandole su olvido.

Para saber que respuesta hay marcada, usamos el método getRespuesta() que habíamos creado en la clase Pregunta

Código: [Seleccionar]
class AccionEnviar implements ActionListener {

@Override
public void actionPerformed(ActionEvent e) {
String respuestas = "";
boolean todasContestadas = true;
for (int i = 0; i < listaPreguntas.size(); i++) {
if (listaPreguntas.get(i).getRespuesta() == null) {
JOptionPane.showMessageDialog(null, "Por Favor, conteste todas las preguntas",
"Preguntas sin respuesta", JOptionPane.WARNING_MESSAGE);
todasContestadas = false;
break;//Dejamos de obtener respuestas.
}
else {
respuestas += (i+1) + " --> " + listaPreguntas.get(i).getRespuesta() + "\n";
}
}

//Mostramos respuestas, si es que las tenemos todas
if (todasContestadas)
JOptionPane.showMessageDialog(null, respuestas, "Respuestas", JOptionPane.INFORMATION_MESSAGE);
}
}

Y bueno, ya tenemos las preguntas inicializadas y también los botones, con sus acciones ya establecidas.
Ahora hay que indicarle al JFrame que layout deseamos:
Código: [Seleccionar]
setLayout(new BoxLayout(getContentPane(), BoxLayout.PAGE_AXIS));Fijate que aquí al constructor del BoxLayout usamos el metodo getContentPane()
En la clase Pregunta nos bastaba con usar la palabra reservada this. Esto es porque Pregunta hereda de JPanel, pero Encuesta hereda de JFrame

Al crear un gestor BoxLayout() hay que pasarle dos parametros, el primero indicarle que contenedor ha de gestionar y segundo la orientacion (vertical u horizontal)
Cuando se trata de una JPanel, estamos tratando explicitamente con un contenedor así que nos basta con referirnos a él con this
Pero cuando tratamos con un JFrame, estamos tratando con un marco, no directamente con su contenedor.. así que tenemos que solicitarle su contenedor con el metodo getContentPane() para que el BoxLayout sepa qué es lo que tiene que gestionar.

Establecido el layout, añadimos las Preguntas que ya están inicializadas. De nuevo gracias al ArrayList, lo hacemos fácilmente con un bucle
Código: [Seleccionar]
for (Pregunta pregun: listaPreguntas)
add(pregun);
Tras las preguntas, creamos un último JPanel para los botones. Para que los botones queden centrados, dejamos el FlowLayout que viene por defecto.
Añadimos lo botones al JPanel, y este JPanel al marco, donde quedará por debajo de las preguntas.
Código: [Seleccionar]
JPanel panelBotones = new JPanel();
panelBotones.add(send);
panelBotones.add(salir);
add(panelBotones);

Y ya por último, al marco JFrame hay que darle unas últimas indicaciones. Los comentarios lo explican

Código: [Seleccionar]
pack();//Automaticamente se organizan todos los componentes dentro del marco
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//Cerrar al pulsar la pestaña superior de cierre.
setResizable(false);//Evitamos que las dimensiones del marco sean manipulables por el usuario
setLocationRelativeTo(null);//El marco aparecerá justo en el centro de la pantalla
setVisible(true);//Hacemos el marco visible

Y con esto ya tenemos el marco listo.

Solo hace falta ponerlo en marcha. Para ello, a nuestra clase Encuesta le añadimos un metodo main() que se encargue de instanciarla.
Código: [Seleccionar]
public static void main(String[] args) {
new Encuesta();

}

Todo esto nos da un formulario muy simple, pero que funciona perfectamente.



Ahora aquí te pongo el código completo de la clase Encuesta.
Ya solo quedaría hablar de como queremos que los datos se graben en un archivo de texto. Pero antes, asegurate de que todo lo que hemos hecho te ha quedado más o menos claro, así que pregunta todo lo que no entiendas, prueba tu a modificar cosas para ver como se comporta, haz lo que sea necesario para entenderlo.
Un saludo.

Código: [Seleccionar]
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public final class Encuesta extends JFrame{

private ArrayList<Pregunta> listaPreguntas = new ArrayList<Pregunta>();
private JButton send, salir;

public Encuesta(){
super("Encuesta");
//Inicializamos componentes
inicializarListaPreguntas();
send = new JButton("Enviar");
send.setFont(new Font("Berlin Sans FB", Font.PLAIN, 14));
send.addActionListener(new AccionEnviar());
salir = new JButton("Salir");
salir.setFont(new Font("Berlin Sans FB", Font.PLAIN, 14));
salir.addActionListener(new AccionSalir());
/*
* Organizamos layout del marco.
* Usaremos un BoxLayout vertical donde se irán apilando las preguntas
* una encima de otra.
* Al final añadiremos un ultimo Jpanel con los dos JButton
*/
setLayout(new BoxLayout(getContentPane(), BoxLayout.PAGE_AXIS));
//Agregamos la preguntas. Recorremos el ArrayList y añadimos una a una
for (Pregunta pregun: listaPreguntas)
add(pregun);
//Finalmente, un JPanel con los botones. Este Jpanel usará el FLowLayout por defecto
JPanel panelBotones = new JPanel();
panelBotones.add(send);
panelBotones.add(salir);
add(panelBotones);
//Definimos comportamiendo del marco
pack();//Automaticamente se organizan todos los componentes dentro del marco
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//Cerrar al pulsar la pestaña superior de cierre.
setResizable(false);//Evitamos que las dimensiones del marco sean manipulables por el usuario
setLocationRelativeTo(null);//El marco aparecerá justo en el centro de la pantalla
setVisible(true);//Hacemos el marco visible
}

class AccionSalir implements ActionListener {

@Override
public void actionPerformed(ActionEvent arg0) {
setVisible(false);
dispose();
}
}

class AccionEnviar implements ActionListener {

@Override
public void actionPerformed(ActionEvent e) {
String respuestas = "";
boolean todasContestadas = true;
for (int i = 0; i < listaPreguntas.size(); i++) {
if (listaPreguntas.get(i).getRespuesta() == null) {
JOptionPane.showMessageDialog(null, "Por Favor, conteste todas las preguntas",
"Preguntas sin respuesta", JOptionPane.WARNING_MESSAGE);
todasContestadas = false;
break;//Dejamos de obtener respuestas.
}
else {
respuestas += (i+1) + " --> " + listaPreguntas.get(i).getRespuesta() + "\n";
}
}

//Mostramos respuestas, si es que las tenemos todas
if (todasContestadas)
JOptionPane.showMessageDialog(null, respuestas, "Respuestas", JOptionPane.INFORMATION_MESSAGE);
}
}

/**
* Inicializa el arrayList con los objetos de la clase Pregunta
*/
private void inicializarListaPreguntas() {
listaPreguntas.add(new Pregunta("1.¿Ha leído folletos informativos respecto a la Donación de Sangre?"));
listaPreguntas.add(new Pregunta("2.¿Ha donado sangre, plaquetas o plasma en los últimos 3 años?"));
/*
* Debido a la longitud de la pregunta 3, usamos codigo HTML dentro del JLabel para conseguir saltos de
* linea perfectamente centrados todo dentro de una unica etiqueta JLabel.
* Esto es gracias a que muchos componentes Swing soportan un HTML basico
*/
listaPreguntas.add(new Pregunta("<html><body><span align='center'>3.¿En los últimos 12 meses se ha realizado tatuajes, perforaciones,</span<br>"
+ "<span align='center'>acupuntura, transfusiones, cateterismos, endoscopias o ha tenido</span><br>"
+ "<span align='center'>contacto sexual con desconocidos?</span></body></html>"));
listaPreguntas.add(new Pregunta("4.¿Ha recibido algún transplante de órgano en los últimos 6 meses?"));
listaPreguntas.add(new Pregunta("5.¿Ha viajado en los últimos 28 dias a zonas con brotes epidemiológicos?"));
}

public static void main(String[] args) {
new Encuesta();

}

}

« Última modificación: 29 de Julio 2018, 21:03 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".