Mostrar Mensajes

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.


Topics - Swing

Pages: [1]
1
¿Un cafecito? / Gracias
« on: Mayo 22, 2013, 10:29:56 am »
Hola Chuidiang!

Este mensaje no es para consultarte nada en especial como en otras ocasiones, sino mas bien para agradecerte mucho por la ayuda que me diste en este tiempo.

La verdad es que aprendi mucho de tu conocimiento y realmente me ayudaste a comprender mejor varias cosas que no tenia demasiado claras.

Lo cierto es que me encontraba terminando de realizar los ultimos ajustes del proyecto final de una materia para recibirme, y tenia muchas dudas.

Asi que gracias a ti logre juntar la fuerza necesaria para hacerle frente, y afortunadamente hace un rato rendi el examen bien y me recibi de ingeniero.

Saludos, y espero volver pronto por aqui, si no es para consultar algo, sera para tomarme un cafecito en esta seccion, jeje. Ahora, a disfrutar. :)

2
Java JSE / Del Codigo al Diagrama de Clases
« on: Mayo 21, 2013, 05:22:32 am »
Hola. Estoy armando el Diagrama de Clases de mi sistema hecho en Java (la parte de la logica de negocios). Alli tengo clases como Alumno, Examinador, Examen, Tema, Pregunta.

Mi consulta es si es necesario agregar al diagrama los getters y setters de cada clase. Que hay del constructor? Y el metodo toString?

O solo conviene agregar las metodos particulares definidos en cada clase por mi?

No importa si alguna clase queda con la caja vacia? (Es decir, sin metodos, o sin atributos si es que los hereda de una clase padre)

Gracias!

3
Java JSE / JScrollPane
« on: Mayo 20, 2013, 02:38:09 pm »
Hola. Estoy intentando agregar un JScrollPane (barra de desplazamiento vertical) en una ventana, como se ve a continuacion:



En este caso me ha funcionado, dado que utilice un unico JPanel en la clase (rendir examen), y escribi lo siguiente:

Code: [Select]
JScrollPane desplazamiento = new JScrollPane(panel);
desplazamiento.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
add(desplazamiento);

Ahora tengo otra clase (corregir examen), donde tambien quiero agregar un JScrollPane, y la ventana se ve similar, asi:



El tema es que esta clase utiliza unos paneles con componentes definidos en otras clases, como ExamenPanel, y ExamenPanel usa ExamenConCorreccionPanel.

El codigo de la clase para corregir examen es el siguiente:

Code: [Select]
import interfaz.paneles.ExamenPanel;

public class GUICorregirExamen extends JFrame {

private static final long serialVersionUID = 1L;

private ExamenPanel examenPanel;

public GUICorregirExamen(Enunciado enunciado, final Examen examen) {

examenPanel = new ExamenPanel(enunciado, examen);

JButton btnCorregir = new JButton("Corregir");
btnCorregir.setAlignmentX(Component.CENTER_ALIGNMENT);

btnCorregir.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
for(Pregunta pregunta : examenPanel.getCorrecciones().keySet()) {
JRadioButton[] rbCorreccion = examenPanel.getCorrecciones().get(pregunta);
if(rbCorreccion[0].isSelected())
examen.agregarCorreccion(pregunta, true);
else if(rbCorreccion[1].isSelected())
examen.agregarCorreccion(pregunta, false);
else {
JOptionPane.showMessageDialog(null,
"Por favor, corrija todas las preguntas", "Error",
JOptionPane.WARNING_MESSAGE);
return;
}
}
examen.calificar();
examenPanel.setLabelCalificacionText("Calificacion: " + examen.getCalificacion());
Repositorio.getInstance().guardarEnunciados();
}
});

JButton btnSalir = new JButton("Salir");
btnSalir.setAlignmentX(Component.CENTER_ALIGNMENT);

btnSalir.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
setVisible(false);
}
});

JPanel panel = new JPanel();
panel.setBackground(Color.white);
panel.setLayout(new FlowLayout());
panel.add(btnCorregir);
panel.add(btnSalir);

examenPanel.add(panel);

JScrollPane desplazamiento = new JScrollPane(examenPanel);
desplazamiento.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
add(desplazamiento);

}

public void run() {
setTitle("Corregir Examen");
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
setSize(700, 700);
setVisible(true);
setLocationRelativeTo(null);
}

}

Y me genera esta pantalla:



Como puedo hacer para que me mantenga la pantalla como en la imagen 2, sin moverme los componentes de lugar?

Desde ya, muchas gracias.

4
Java JSE / Excepciones
« on: Mayo 19, 2013, 02:35:03 pm »
Hola Chuidiang. Te queria hacer una consulta sobre excepciones. Resulta que tengo las siguientes clases con los metodos que muestro a continuacion:

  • CargaDeDatos:

Code: [Select]
try {
Repositorio.getInstance().setTemas(temas);
} catch(NullPointerException e) {
System.out.println("No se pudo acceder al archivo de temas" + e);
}

try {
Repositorio.getInstance().setPreguntas(preguntas);
} catch(NullPointerException e) {
System.out.println("No se pudo acceder al archivo de preguntas" + e);
}

  • Repositorio:

Code: [Select]
/**
* Persiste todos los temas, actualizando tambien los que corresponda
*/
public void setTemas(List<Tema> temas) {
this.temas = temas;
this.persistorTemas.guardar(temas, path + "../Archivos/Temas.xml");
}

/**
* Persiste todos las preguntas, actualizando tambien las que corresponda
*/
public void setPreguntas(List<Pregunta> preguntas) {
this.preguntas = preguntas;
this.persistorPreguntas.guardar(preguntas, path + "../Archivos/Preguntas.xml");

}

  • Persistor:

Code: [Select]
public void guardar(T dato, String archivo) {

try {

FileOutputStream os = new FileOutputStream(archivo);
XMLEncoder encoder = new XMLEncoder(os);
encoder.writeObject(dato);
encoder.close();

} catch(FileNotFoundException e) {

System.out.println("No se encontro el archivo " + e);

}

}

El tema es el siguiente:

- La clase CargaDeDatos llama al metodo setTemas en la clase Repositorio.

- La clase Repositorio llama al metodo guardar en la clase Persistor.

Si el archivo de temas / preguntas no existe, el metodo guardar de la clase Persistor me muestra: "No se encontro el archivo" (FileNotFoundEx)

Despues regresa a la clase CargaDeDatos y me muestra: "No se pudo acceder al archivo de temas / preguntas" (NullPointerEx)

Mi idea es utilizar solamente un mensaje para los temas y solamente un mensaje para las preguntas, no dos para cada uno de ellos...

El asunto es que intente quitando el mensaje de la clase CargaDeDatos, quedandome asi:

Code: [Select]
Repositorio.getInstance().setTemas(temas);
Repositorio.getInstance().setPreguntas(preguntas);

El problema es que cuando el archivo de temas / preguntas no existe, me muestra:

Code: [Select]
No se encontro el archivo (FileNotFoundEx)
Exception in thread "main" java.lang.NullPointerException
at java.util.ArrayList.addAll(Unknown Source)
at persistencia.Repositorio.<init>(Repositorio.java:45)
at persistencia.Repositorio.getInstance(Repositorio.java:55)
at persistencia.CargaDeDatos.main(CargaDeDatos.java:115)

Es por eso que queria saber como podria hacer para que no me muestre toda esa pila del NullPointer, mostrando solamente un mensaje.

Desde ya, muchas gracias por tu tiempo. Saludos.

5
Java JSE / Constructor GUI + Variables
« on: Mayo 19, 2013, 02:53:44 am »
Hola Chuidiang. Te queria consultar que diferencia hay entre declarar las variables afuera o adentro del constructor, con respecto a la interfaz grafica.

Me refiero en terminos de eficiencia, es decir, asegurandome que los componentes seran creados cuando realmente se los necesite utilizar.

  • Variables afuera del constructor:

Code: [Select]
public class HMGUI extends JFrame {

private JLabel label = new JLabel("Hola Mundo");
private JButton btn = new JButton("Click");

public HMGUI() {

add(label);
add(btn);
}

public static void main(String[] args) {

Consola.run(new HMGUI(), 300, 300, "GUI");
}

}

  • Variables adentro del constructor:

Code: [Select]
public class HMGUI extends JFrame {

public HMGUI() {

private JLabel label = new JLabel("Hola Mundo");
private JButton btn = new JButton("Click");

add(label);
add(btn);
}

public static void main(String[] args) {

Consola.run(new HMGUI(), 300, 300, "GUI");
}

}

¿Es posible que la segunda opcion sea mas conveniente, o es similar?

Desde ya, muchas gracias.

6
Java JSE / Modelo de 3 Capas
« on: Mayo 16, 2013, 12:17:19 am »
Hola. Te queria preguntar si, por casualidad, tendrias algun link para enviarme con informacion sobre el modelo de 3 capas (gui, logica de negocio y persistencia)?

Me vendria bien para guiarme y chequear que cada parte del codigo este donde tenga que estar. Muchisimas gracias.

7
Java JSE / Eleccion de Clases a partir de un Enunciado
« on: Mayo 15, 2013, 06:17:44 am »
La última consulta que queria hacerte de momento es con respecto al enunciado de mi programa que agrego a continuacion:

------------------------------

Desarrollar un sistema que cumpla con los siguientes requisitos:
Implementar una aplicación de generación de exámenes teniendo en cuenta los siguientes requerimientos funcionales:
•   Hay dos tipos de preguntas: abiertas y multiple choice. Las primeras son preguntas textuales que el alumno debe desarrollar para responder. Las segundas son preguntas textuales que tienen opciones para que el alumno elija una. Cada pregunta pertenece a un tema y cada tema está identificado por un código y una descripción.
•   Un examen tiene N preguntas y cada pregunta tiene una respuesta (ingresada por el alumno). Es importante identificar al alumno que rinde el examen y al examinador (la persona que armó el examen).
•   Para generar el examen, el examinador debe indicar la cantidad de preguntas que quiere por cada tema. Las preguntas se seleccionan de forma aleatoria de una base de preguntas.
•   La corrección se realiza en dos partes: corrección automática en las preguntas multiple choice y corrección manual en las preguntas abiertas.
•   Los exámenes generados se deben persistir y se debe poder crear un ejemplar de cada examen por cada alumno. El alumno completa el examen y luego obtiene la corrección de la parte automática, quedando a la espera de la corrección manual por parte del examinador. Para finalizar la corrección, el examinador corregirá las preguntas abiertas.
•   Reportes:
o   Listado de exámenes
o   Resoluciones de exámenes mostrando las preguntas y las respuestas de cada examen por cada alumno junto con su nota.

------------------------------

El sistema ya lo tengo armado, pero el tema es que me surgieron algunas dudas con respecto a la eleccion de las clases que tengo que tener en el proyecto, ya que a veces no distingo basicamente si todos los sustantivos del enunciado deberian ser clases o no, o si eso depende del alcance del programa... Leyendo en un par de libros, encontre que hay que seleccionar solo los sustantivos que tengan significado, por esta razon omitimos a varios. Las clases que tengo yo son:

  • Alumno:

Code: [Select]
public class Alumno {

private String nombre;

// metodos

}

  • Enunciado (Modelo del Examen):

Code: [Select]
public class Enunciado {

private int id;
private Examinador examinador;
private List<Pregunta> preguntas = new ArrayList<Pregunta>();
private List<Prueba> pruebas = new ArrayList<Prueba>();

private Map<Tema, Integer> cantidadElegidaPorTema = new HashMap<Tema, Integer>();
private Map<Tema, List<Pregunta>> preguntasPorTemaDesordenadas;

// metodos

}

  • Examinador:

Code: [Select]
public class Examinador {

private String nombre;

// metodos

}

  • Pregunta:

Code: [Select]
public abstract class Pregunta {

private Tema tema;
private String texto;

// metodos

}

  • PreguntaAbierta:

Code: [Select]
public class PreguntaAbierta extends Pregunta {

// metodos

}

  • PreguntaMultipleChoice:

Code: [Select]
public class PreguntaMultipleChoice extends Pregunta {

private List<String> opciones = new ArrayList<String>();
private String acierto;

// metodos

}

  • Prueba (Examen):

Code: [Select]
public class Prueba {

private int numero;
private Alumno alumno;
private float calificacion = -1;
private Map<Pregunta, String> respuestas = new HashMap<Pregunta, String>();

private Map<Pregunta, Boolean> correccion = new HashMap<Pregunta, Boolean>();

// metodos

}

  • Tema:

Code: [Select]
public class Tema {

private int codigo;
private String descripcion;

// metodos

}

------------------------------

xxxxx En la version anterior del sistema, tambien tenia estas clases:

------------------------------

  • Opcion:

Code: [Select]
public class Opcion {

private String opcion;

// metodos

}


  • Respuesta:

Code: [Select]
public abstract class Respuesta {

// metodos

}

  • RespuestaAbierta:

Code: [Select]
public class RespuestaAbierta extends Respuesta {

private String texto;

// metodos

}

  • RespuestaMultipleChoice:

Code: [Select]
public class RespuestaMultipleChoice extends Respuesta {

private Opcion opcion;

// metodos

}

El asunto es que una persona que me ayudo, saco esas ultimas clases: Opcion, Respuesta, RespuestaAbierta y RespuestaMultipleChoice.

La explicacion que me dio fue que no tiene mucho sentido incorporarlas al proyecto, dado que solo manejan una variable, y es recomendable usarlas como tal.

Asi que justamente queria preguntarte eso, si conviene utilizar solamente las clases que te defini mas arriba, que seria como yo lo tengo armado...

Espero que me puedas aclarar esto, ya que es mi gran duda existencial, jaja. Desde ya, muchas gracias por tu tiempo. Saludos!

8
Java JSE / public boolean equals(Object obj)
« on: Mayo 15, 2013, 03:36:57 am »
Hola Chuidiang. Te queria consultar lo siguiente. Dentro de mi sistema, tengo esta clase definida con el metodo equals, generado a partir del Eclipse:

Code: [Select]
package logica;

public class Tema {

private int codigo;
private String descripcion;

public Tema(int codigo, String descripcion) {

this.codigo = codigo;
this.descripcion = descripcion;

} public Tema() {}

public int getCodigo() {

return codigo;
}

public void setCodigo(int codigo) {

this.codigo = codigo;
}

public String getDescripcion() {

return descripcion;

}

public void setDescripcion(String descripcion) {

this.descripcion = descripcion;
}

@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Tema other = (Tema) obj;
if (codigo != other.codigo)
return false;
return true;
}

public String toString() {
return this.descripcion;
}


}

Mi pregunta es que diferencia hay entre usar ese metodo generado automaticamente y el metodo equals tradicional, que se utiliza por default internamente?

(Me refiero a cuando no definimos el metodo equals en alguna clase como la de recien y luego comparamos dos objetos de igual forma.)

Desde ya, muchas gracias.

---

PD: Disculpa la cantidad de consultas, jaja, es que tengo que ajustar algunas cositas en mi proyecto para una materia y me quiero sacar las dudas, de la mano de alguien que sabe.

9
Java JSE / private static final long serialVersionUID = 1L;
« on: Mayo 15, 2013, 02:47:08 am »
Hola Chuidiang. Te queria consultar si es recomendable utilizar la siguiente linea de codigo en algunas de mis clases de GUI:

Code: [Select]
private static final long serialVersionUID = 1L;
Dado que, si no, me aparecera el mensaje de alerta:

Code: [Select]
The serializable class Test does not declare a static final serialVersionUID field of type long
Te pregunto eso ya que la idea no es agregar cosas porque si, sino porque realmente sea necesario.

Desde ya, muchas gracias.

10
Java JSE / Serializacion en XML y Constructores Vacios
« on: Mayo 14, 2013, 11:59:42 am »
Hola Chuidiang. Te queria consultar algo. En mi proyecto, tengo la siguiente clase que me permite serializar y persistir objetos:

Code: [Select]
import java.beans.XMLDecoder;
import java.beans.XMLEncoder;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

public class Persistor<T> {

    private T data;

    public void save(T data, String file) {

        try {

            FileOutputStream os = new FileOutputStream(file);
            XMLEncoder encoder = new XMLEncoder(os);
            encoder.writeObject(data);
            encoder.close();

        } catch(FileNotFoundException e) {

            System.out.println("File not found");

        }

    }

    @SuppressWarnings({ "unchecked", "finally" })
    public T read(String file) {

        try {

            FileInputStream fis = new FileInputStream(file);
            XMLDecoder decoder = new XMLDecoder(fis);
            data = (T)decoder.readObject();
            decoder.close();

        } catch(FileNotFoundException e) {

            System.out.println("File not found");

        } finally {

            return data;

        }

    }

}

Ahora, el tema es que tambien tengo esta otra clase, que basicamente me obliga a tener el constructor vacio (sin argumentos) public Alumno() {}:

Code: [Select]
package logica;

public class Alumno {

private String nombre;

public Alumno(String nombre) {

this.nombre = nombre;

} public Alumno() {} // <==========

public String getNombre() {

return nombre;

}

public void setNombre(String nombre) {

this.nombre = nombre;

}

public String toString() {

return nombre;

}

}

Si no lo agrego y luego corro el programa, me aparecera lo siguiente por consola:

Code: [Select]
java.lang.InstantiationException: logic.Alumno
Continuing ...
java.lang.IllegalStateException: The outer element does not return value
Continuing ...

Me gustaria saber si existe alguna forma para no tener que utilizar un constructor vacio en cada una de las clases de mi sistema.

Espero tu respuesta. Muchas gracias.

11
Java JSE / Asignaciones de Texto en Strings
« on: Mayo 14, 2013, 10:18:40 am »
Hola Chuidiang. Te queria consultar, en terminos de performance, si conviene realizar las asignaciones de texto como figuran en el ejemplo 1 o en el ejemplo 2:

  • Ejemplo 1:

Code: [Select]
public class Test {

    public static void main(String[] args) {       

        String option1 = "Text 1";
        String option2 = "Text 2";
        String option3 = "Text 3";

}

  • Ejemplo 2:

Code: [Select]
public class Test {

    public static void main(String[] args) {       

        String option1 = new String("Text 1");
        String option2 = new String("Text 2");
        String option3 = new String("Text 3");

}

Espero tu respuesta. Muchas gracias.

Pages: [1]
ey