Creando un programa para controlar faltas de asistencia (Curso)

Iniciado por Yunkito, 1 Septiembre 2013, 00:29 AM

0 Miembros y 2 Visitantes están viendo este tema.

Yunkito

Hola muy buenas que tal.
Os explico un poco lo que estoy haciendo. Resulta que nos han puesto como ejercicio que en un par de dias expongamos cada uno un programa, yo he pensado en hacer un programa para controlar las faltas de asistencia.

Creia que seria un poco mas facil pero creo que me he complicado yo mismo o me he saturado. jeje, que tambien suele pasar con esto.

Os expongo un poco lo que estoy haciendo o trato de hacer.

La idea como he dicho es crear un programa o app que controle las faltas de asistencia de un sitio determinado.

Una cosa basica, con estas opciones:

Añadir Faltas, Borrar Faltas (En caso de que sean justificadas o se hubiesen puesto por error), Mostrar Faltas (Mostras todas las faltas de todas las personas), Resetear Faltas.

Mas o menos eso es lo que quiero hacer y se que tampoco es muy complicado para los conocimientos que ya tengo. Pero muchas veces me atasco en cosas que tampoco tienen tanta dificultad y ya no se salir. Sera porque no lo enfoco bien o se puede hacer de otra manera mas facil o no lo se.

He hecho lo siguiente:

Código (java) [Seleccionar]


import java.awt.Container;

import javax.swing.JFrame;

import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.Container;


public class principal extends JFrame {

panelanadirfaltas anadirfaltas; // Creamos estos objetos una vez creadas las clases (tipo nombre). Definicimos los tres Atributos
panelborrarfaltas borrarfaltas;
panelfaltastotales faltastotales;
String (((((AQUI VAN LOS NOMBRES DE LAS PERSONAS DEL CURSO)))))

principal (){  //CREAMOS EL CONSTRUCTOR
super ("Falteitor 1.0");  //Nombre de la Aplicacion
setBounds(200, 200, 200, 200); // Tamaño de la ventana
setVisible(true); // Hacemos Visible la ventana, por defecto viene "invisible"
setResizable(false); // Con ese metodo no podemos cambiar el tamaño de la ventana

Container contentpane = getContentPane();
contentpane.setLayout (new GridLayout(3,3)); //Cremos el aspecto del panel, con tres columnas y tres filas

// Inicializamos los atributos
anadirfaltas = new panelanadirfaltas();
borrarfaltas = new panelborrarfaltas();
faltastotales = new panelfaltastotales();

contentpane.add(anadirfaltas);
contentpane.add(borrarfaltas);
contentpane.add(faltastotales);



}



public static void main (String []args){ // Creamos esta clase para inicializar la ventana

principal ventana = new principal();


}

}
[/quote]

Clase para Añadir Faltas:

[quote]
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JPanel;


public class panelanadirfaltas extends JPanel implements ActionListener {

JButton boton1;

panelanadirfaltas(){
this.setBackground(Color.red);

FlowLayout layout = new FlowLayout();
layout.setHgap(20);
setLayout (layout);

boton1 = new JButton();

add(boton1);

}


public void actionPerformed(ActionEvent e) {


}

}


Y aqui es donde me he quedado pillado. Ahora en la ultima linea tengo que poner que quiero que haga el boton cuando le doy. Supuestamente ese metodo escucha lo que quiero hacer con clickee en el boton que deberia poner alli?

Porque lo que quiero es que se me habra otro panel y salga un JTextField y que el usuario introduzca un nombre y a ese nombre le sume 1.

Hay cosas que si se, pero no se como hacer que se le sume 1 al nombre de los 15 o 20 que hay. Estaria bien echo con un Case?




Zoik

#1
A continuación del botón ponle:

Código (java) [Seleccionar]
boton1.addActionListener(this);

En el método que recoge los eventos le pones:

Código (java) [Seleccionar]
if(e.getSource() == boton1){
// Código que quieres ejecutar al pulsar ese botón
}


Yo en tu lugar haría una class tipo alumno y allí estipularia sus datos.
Dime si te sirve.
Un saludo.

Yunkito

Muchas gracias Zoik.

Todo eso ya lo hice y va perfecto pero el problema esta en que no se que poner despues del ActionListener para que me muestre un nuevo Panel, o que me muestre una pantalla en la que pueda poner un nombre y darle a un boton que sume 1 a el nombre que yo ponga.

Codigo
Citar
public void actionPerformed(ActionEvent e) {
   if (e.getSource() == anadirfaltas){
       JLabel texto = new JLabel("Introduzca Nombre");
       add(texto);
      
   }

Un saludo y gracias.

Zoik

#3
Bueno a ver, lo ideal a mi parecer no sería introducir un nombre y que le ponga falta, lo que estaría bien sería, mostrar una JTable con todos los nombres de la clase y a raíz de hay poner al lado de cada nombre un JCheckBox, para ir marcando los alumnos que han "faltado", al acabar darle al botón aceptar y se le sumaría una falta a cada alumno con el JCheckBox marcado, no se si me e explicado.

Bien, sabiendo esto,estaría bien que al darle a tu botón, se abriese una ventana con dicha tabla, para ello normalmente se utiliza un JDialog.

Código (java) [Seleccionar]
/*
* Autor: Zoik
*/
public class Main {

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

}


Código (java) [Seleccionar]
/*
* Autor: Zoik
*/
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;

public class Gui extends JFrame implements ActionListener{

private static final long serialVersionUID = 1L;
private JButton boton = new JButton("Pulsame!");
private JDialog pasarLista = new JDialog();
private DefaultTableModel model = new DefaultTableModel(){
private static final long serialVersionUID = 1L;
public boolean isCellEditable(int row, int col){
if(col == 2){
return true;
}
return false;
}
};
private JTable tabla = new JTable(model);
private JScrollPane pane = new JScrollPane(tabla);
private JButton botonAceptar = new JButton("Aceptar");
private ArrayList<Alumno> alumnos = new ArrayList<Alumno>();
private final int columnas = 3;
private TableColumn tableColumn;

public Gui(){
setSize(200,200);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
add(boton);
boton.addActionListener(this);
defineTable();
agregarAlumnos();
}

public void agregarAlumnos(){ // Este método lo agrego para que veas como darías de alta alumnos, hay dos formas

alumnos.add(new Alumno("Pepe","Benito","Fraguas")); // Hacerlo todo directamente pasandole por parámetro al constructor sobrecargado lo que tiene que asignarles a las variables

alumnos.add(new Alumno());
alumnos.get(1).setNombre("Juan");
alumnos.get(1).setPrimerApellido("Armando"); // No pasarle nada por constructor y hacerlo a mano con los métodos de la calss Alumno
alumnos.get(1).setSegundoApellido("No se que poner");

}

public void actionPerformed(ActionEvent e) {
if(e.getSource() == boton){
definePasarLista();
addRow();
} else if(e.getSource() == botonAceptar){
int rowsCount = model.getRowCount();
for(int i = 0; i < rowsCount; i++){
if(((Boolean) tabla.getValueAt(i, 2)).booleanValue() == true){
alumnos.get(i).addFalta();
}
}
/*for(int i = 0; i < rowsCount; i++){
System.out.println(alumnos.get(i).getNombre()+" - "+alumnos.get(i).getFaltas()); //Con esto compruebas al darle a aceptar, las faltas que tienen todos en consola.
}*/
pasarLista.dispose();
}

}

public void defineTable(){
model.addColumn("Nombre");
model.addColumn("Apellidos");
model.addColumn("Falta");
tableColumn = tabla.getColumnModel().getColumn(2);
tableColumn.setCellEditor(tabla.getDefaultEditor(Boolean.class));  
tableColumn.setCellRenderer(tabla.getDefaultRenderer(Boolean.class));
}

public void addRow(){
Object [] data = new Object[columnas];
int size = alumnos.size();
int rowsCount = model.getRowCount();
for(int i = 0; i < rowsCount; i++){
model.removeRow(0);
}
for(int i = 0; i < size; i++){
data[0] = alumnos.get(i).getNombre();
data[1] = alumnos.get(i).getPrimerApellido()+ " " +alumnos.get(i).getSegundoApellido();
data[2] = false;
model.addRow(data);
}
}

public void definePasarLista(){
pasarLista.setTitle("Pasar Lista");
pasarLista.setSize(800,800);
pasarLista.setLocationRelativeTo(null);
pasarLista.setLayout(new BorderLayout());
pasarLista.setVisible(true);
pasarLista.add(pane, BorderLayout.CENTER);
pasarLista.add(botonAceptar, BorderLayout.SOUTH);
botonAceptar.addActionListener(this);
}

}


Código (java) [Seleccionar]
/*
* Autor: Zoik
*/
public class Alumno {

private String nombre,primerApellido,segundoApellido;
private int faltas = 0;

public Alumno(){

}

public Alumno(String nombre, String primerApellido, String segundoApellido){
this.nombre = nombre;
this.primerApellido = primerApellido;
this.segundoApellido = segundoApellido;
}

public void setNombre(String value){
nombre = value;
}

public void setPrimerApellido(String value){
primerApellido = value;
}

public void setSegundoApellido(String value){
segundoApellido = value;
}

public String getNombre(){
return nombre;
}

public String getPrimerApellido(){
return primerApellido;
}

public String getSegundoApellido(){
return segundoApellido;
}

public void addFalta(){
faltas++;
}

public void removeFalta(){
faltas--;
}

public int getFaltas(){
return faltas;
}
}


Lo e hecho suponiendo que ya tienes lo anterior hecho, obviamente no pondrías únicamente un botón al abrir la aplicación. Si quieres hacer interfaces rápido, NetBeans está genial con su bonito drag and drop, si quieres aprender mucho yo recomiendo Eclipse, yo empece con el y  no me e separado nunca, no vayas al lado oscuro  :o.

Un saludo y ya comentaras que tal te a ido.

Yunkito

Muy buenas de nuevo Zoik y muchas gracias por dedicarme un poco de tu tiempo en decirme como van las cosas, de verdad que te lo agradecezco muchisimo.

He copiado el programa y lo he echado andar haciendo unas cuantas modificaciones. Y es una cosa basica tal y como queria, el poder agregar faltas a los alumnos de una clase.

He metido los alumnos (dar de alta) manuales por el primer metodo que pones ya que es mas rapido y tiene menos lineas de codigo.

Hay algunas cosas que no entiendo, si me pongo a enumerartelas te volveria loco, pero para eso esta internet para ver que siginifica y que hace cada cosa, con mis conocimientos y el codigo que hay alrededor de esas cosas que no entiendo seguro que sabre lo que es.

Lo que si nose es lo siguiente. He echo andar el programa y lo he ejecutado desde el pc como si estuviese terminado para ver la muestra de las faltas. Y si me las muestra por consola, pero para verlas por PC cuando la aplicacion este terminada como lo hago?
Nunca he terminado una aplicacion y nose como se hace.

Un saludo y muchisimas gracias nuevamente Zoik ;)


Por cierto mis inicios fueron con NetBeans ;) y ya me quedo con eclipse que llevo poco tiempo probando. Me gusta mas. Asi que aqui me quedo.

Zoik

Bueno puedes hacerlo de muchas maneras distintas, la idea sería coger otro JTable distinto y printar todos los alumnos, y en vez de tener el JCheckBox para poner faltas le pones el número de faltas que tiene cada alumno con el método de getFaltas(), con el código que te e pasado tendría que ser muy fácil hacer esta parte.

PD: Cuando tengas mas tiempo si veo que no tiras ya te posteo código, pero primero intentalo buscando en internet.

Un saludo.

Yunkito

Ok Zoik muchas gracias otra vez!!!!

No te preocupes que llevo todo el dia rompiendome el coco buscando cosas, si molesto es porque ya le he dado muchas vueltas jejeje.

En el momento que saque algo en claro te comento.

Un saludo y gracias nuevamente, no me cansare de dartelas!! :)