import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
/**
* Class que contiene todo el proyecto.
* @author Rafael Angel Montero Fernández
* Correo Sharkyc12@Gmail.com
*/
public class ListaOrdenadaDeNodos {
public static void main(String args[]){
ListaOrdenadaDeNodos listaOrdenadaDeNodos = new ListaOrdenadaDeNodos();
}
private Formulario frmTDA=new Formulario();
public ListaOrdenadaDeNodos(){
frmTDA.setVisible(true);
}
private void decir(String datos){
System.out.println("////////informando desde ListaEnlazada////////");
System.out.println(datos + "\n\n");
}
public class Formulario extends JFrame{
private Botones botones=null;
private Cuadro_de_texto nombre=null;
private Cuadro_de_texto valor=null;
private Eventos eventos=new Eventos();
private TDA_ordenado tda=new TDA_ordenado();
private Nodo un_nodo=null;
public Formulario(){
this.setTitle("Lista ordenada de nodos.");
this.setLayout(null);
setResizable(false);
setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setBounds(100, 100, 450, 250);
nombre=new Cuadro_de_texto(10, 0,"Nombre", "");
valor=new Cuadro_de_texto(10, 75,"Valor", "");
add(nombre);
add(valor);
botones=new Botones(0, 150, eventos);
add(botones);
}
private void msj(String nuevos_datos){
JOptionPane.showMessageDialog(null, nuevos_datos);
}
public class Eventos implements ActionListener{
@Override
public void actionPerformed(ActionEvent arg0) {
this.click_insertar(arg0);
this.click_buscar(arg0);
this.click_imprimir(arg0);
this.click_eliminar(arg0);
this.click_salir(arg0);
}
public void click_insertar(ActionEvent evt){
if(evt.getActionCommand().equalsIgnoreCase(botones.getInsertar())==true){
tda.insertar(new Nodo(nombre.getTexto(), valor.getTextoNumerico()));
}
}
public void click_buscar(ActionEvent evt){
if(evt.getActionCommand().equalsIgnoreCase(botones.getBuscar())==true){
if(tda.buscar(new Nodo(nombre.getTexto(), valor.getTextoNumerico()))==true){
msj(tda.getNodoEncontrado().toString());
un_nodo=tda.getNodoEncontrado();
nombre.setTexto(un_nodo.getNombre());
valor.setTexto(un_nodo.getValor() + "");
}else{
msj("El registro no existe.");
}
}
}
public void click_imprimir(ActionEvent evt){
if(evt.getActionCommand().equalsIgnoreCase(botones.getImprimir())==true){
msj(tda.imprimir()) ;
}
}
public void click_eliminar(ActionEvent evt){
if(evt.getActionCommand().equalsIgnoreCase(botones.getEliminar())==true){
if(tda.eliminar_nodo(new Nodo(nombre.getTexto(), valor.getTextoNumerico()))==true){
msj("Nodo eliminado");
}else{
msj("No se puede eliminar porque el nodo no existe.");
}
}
}
public void click_salir(ActionEvent evt){
if(evt.getActionCommand().equalsIgnoreCase(botones.getSalir())==true){
System.exit(0);
}
}
}
}
/**
* Botones para el form.
*/
public class Botones extends JPanel{
private JButton jbInsertar=new JButton("Insertar");
private JButton jbBuscar=new JButton("Buscar");
private JButton jbImprimir=new JButton("Imprimir");
private JButton jbEliminar=new JButton("Eliminar");
private JButton jbSalir=new JButton("Salir");
public Botones(){
this.inicio(0, 0, null);
}
public Botones(int x, int y, ActionListener nuevo_controlador_de_eventos){
this.inicio(0, y, nuevo_controlador_de_eventos);
}
public String getSalir(){
return jbSalir.getText();
}
public String getEliminar(){
return jbEliminar.getText();
}
public String getImprimir(){
return jbImprimir.getText();
}
public String getInsertar(){
return jbInsertar.getText();
}
public String getBuscar(){
return jbBuscar.getText();
}
private void inicio(int x, int y, ActionListener nuevo_controlador_de_eventos){
this.setBounds(x, y, 450, 40);
jbInsertar.setBounds(0, 0, 50, 25);
jbBuscar.setBounds(50, 0, 50, 25);
jbImprimir.setBounds(100, 0, 50, 25);
jbEliminar.setBounds(150, 0, 50, 25);
jbSalir.setBounds(200, 0, 50, 25);
add(jbInsertar);
add(jbBuscar);
add(jbImprimir);
add(jbEliminar);
add(jbSalir);
jbInsertar.addActionListener(nuevo_controlador_de_eventos);
jbBuscar.addActionListener(nuevo_controlador_de_eventos);
jbImprimir.addActionListener(nuevo_controlador_de_eventos);
jbEliminar.addActionListener(nuevo_controlador_de_eventos);
jbSalir.addActionListener(nuevo_controlador_de_eventos);
}
}
/**
* Control personalizado que va pegado varias veces en el form.
*/
public class Cuadro_de_texto extends JPanel{
private JLabel jlEtiqueta=null;
private JTextField jtCampo_de_texto=null;
private String txtCaption="";
private String txtTexto="";
public Cuadro_de_texto(){
this.inicio(0, 0, "Caption", "texto");
}
public Cuadro_de_texto(int x, int y, String nuevo_caption, String nuevo_texto){
this.inicio(x, y, nuevo_caption, nuevo_texto);
}
private void inicio(int x, int y, String nuevo_caption, String nuevo_texto){
this.setBounds(x, y, 200, 70);
this.setLayout(null);
jlEtiqueta=new JLabel(nuevo_caption);
jlEtiqueta.setBounds(0, 0, 195, 30);
jtCampo_de_texto=new JTextField(nuevo_texto);
jtCampo_de_texto.setBounds(0, 27, 195, 30);
add(jlEtiqueta);
add(jtCampo_de_texto);
}
public void setCaption(String nuevo_caption){
this.txtCaption=nuevo_caption;
jlEtiqueta.setText(txtCaption);
}
public String getCaption(){
return this.jlEtiqueta.getText();
}
public void setTexto(String nuevo_texto){
this.txtTexto=nuevo_texto;
this.jtCampo_de_texto.setText(txtTexto);
}
public String getTexto(){
return jtCampo_de_texto.getText();
}
/**
* Se usa un try catch por si se usa la propiedad y los datos son letras.
* @return Retorna el texto con formato numerico, siempre y cuando el texto sean un numero.
*/
public int getTextoNumerico(){
try{
return Integer.parseInt(jtCampo_de_texto.getText());
}catch(NumberFormatException ex){
decir("La informacion recuperada no se puede formatear a un numero");
}
return 0;
}
}
/**
* El tda ordenado es simplemente una lista enlazada que inserta datos en orden.
*/
public class TDA_ordenado{
private Nodo lista_de_nodos=null;
/**
* Se carga con los datos de la busqueda en caso de encontrar coincidencias.
*/
private Nodo nodo_encontrado=null;
public TDA_ordenado(){}
/**
* Despues de realizar la busqueda, se puede recuperar el nodo encontrado en la busqeuda por medio de esta propiedad.
*/
public Nodo getNodoEncontrado(){
return this.nodo_encontrado;
}
public boolean eliminar_nodo(Nodo nodo_a_eliminar){
//Elimina al primero en la lista, desplazamiento hacia atras.
if(this.lista_de_nodos.getValor()==nodo_a_eliminar.getValor()){
lista_de_nodos=lista_de_nodos.getSiguiente();
return true;
}
Nodo lista_temporal_de_nodos=lista_de_nodos;
while(lista_temporal_de_nodos!=null){
if(lista_temporal_de_nodos==null){
return false;
}
//Elimina entre nodos o el ultimo.
if(lista_temporal_de_nodos.getValor()==nodo_a_eliminar.getValor()){
lista_temporal_de_nodos.setSiguiente(lista_temporal_de_nodos.getSiguiente().getSiguiente());
return true;
}
lista_temporal_de_nodos=lista_temporal_de_nodos.getSiguiente();
}
return false;
}
/**
* Permite indicar si existe el nodo por medio de su propiedad valor.
* @param nodo_de_busqueda
* @return true si existe el nodo, false en caso de no existir.
*/
public boolean buscar(Nodo nodo_de_busqueda){
Nodo lista_temporal_de_nodos=lista_de_nodos;
while(lista_temporal_de_nodos!=null){
if(lista_temporal_de_nodos.getValor()==nodo_de_busqueda.getValor()){
nodo_encontrado=new Nodo(lista_temporal_de_nodos.getNombre(), lista_temporal_de_nodos.getValor());
return true;
}
lista_temporal_de_nodos=lista_temporal_de_nodos.getSiguiente();
}
return false;
}
/**
*
* @return Retorna los datos de todo los nodos.
* Es lo mismo que toString().
*/
public String imprimir(){
if(lista_de_nodos==null){
return "";
}
String datos_del_tda="";
Nodo lista_temporal_de_nodos=lista_de_nodos;
int conteo_de_nodos=0;
while(lista_temporal_de_nodos!=null){
conteo_de_nodos++;
datos_del_tda+=lista_temporal_de_nodos.toString() + "\n";
lista_temporal_de_nodos=lista_temporal_de_nodos.getSiguiente();
}
return datos_del_tda + "\nTotal de nodos " + conteo_de_nodos;
}
@Override
public String toString(){
//Ejemplo de reutilizacion de codigo.
return this.imprimir();
}
public boolean insertar(Nodo nuevo_nodo){
//Lo pone al inicio.
if(this.lista_de_nodos==null){
this.lista_de_nodos=new Nodo(nuevo_nodo.getNombre(), nuevo_nodo.getValor());
decir("inicio " + lista_de_nodos.toString());
return true;
}
Nodo lista_temporal_de_nodos=lista_de_nodos;
//Lo al inicio causando un desplazamiento de datos hacia el final de la lista.
if(lista_de_nodos.getValor()>nuevo_nodo.getValor()){
lista_temporal_de_nodos=this.lista_de_nodos;
lista_de_nodos=new Nodo(nuevo_nodo.getNombre(), nuevo_nodo.getValor());
lista_de_nodos.setSiguiente(lista_temporal_de_nodos);
decir("Inicio desplazamiento " + lista_de_nodos.toString());
return true;
}
Nodo siguiente=null;
while(lista_temporal_de_nodos!=null){
if(lista_temporal_de_nodos!=null ){
//Insertar entre nodos.
if(lista_temporal_de_nodos.getSiguiente()!=null){
if(lista_temporal_de_nodos.getValor()<nuevo_nodo.getValor() && lista_temporal_de_nodos.getSiguiente().getValor()>nuevo_nodo.getValor()){
siguiente=lista_temporal_de_nodos.getSiguiente();
lista_temporal_de_nodos.setSiguiente(new Nodo(nuevo_nodo.getNombre(), nuevo_nodo.getValor(), siguiente));
lista_temporal_de_nodos=lista_temporal_de_nodos.getSiguiente();
decir("Entre nodos " + lista_temporal_de_nodos.toString());
return true;
}
}
}
//Inserta un nodo al final.
if(lista_temporal_de_nodos.getSiguiente()==null){
lista_temporal_de_nodos.setSiguiente(nuevo_nodo);
lista_temporal_de_nodos=lista_temporal_de_nodos.getSiguiente();
decir("Al final " + lista_temporal_de_nodos.toString());
return true;
}
lista_temporal_de_nodos=lista_temporal_de_nodos.getSiguiente();
}
return false;
}
}
/**
* Clase nodo para la lista enlazada.
*/
public class Nodo{
private Nodo siguiente=null;
private String nombre="";
private int valor=0;
public Nodo(){}
public Nodo(String nuevo_nombre, int nuevo_valor){
setNombre(nuevo_nombre);
setValor(nuevo_valor);
}
public Nodo( Nodo nuevo_nodo){
setSiguiente(nuevo_nodo);
}
public Nodo(String nuevo_nombre, int nuevo_valor, Nodo nuevo_nodo){
setNombre(nuevo_nombre);
setValor(nuevo_valor);
setSiguiente(nuevo_nodo);
}
@Override
public String toString(){
return "Nombre " + this.getNombre() + ", valor " + this.getValor();
}
public void setSiguiente(Nodo nuevo_nodo){
siguiente=nuevo_nodo;
}
public Nodo getSiguiente(){
return this.siguiente;
}
public void setNombre(String nuevo_nombre){
nombre=nuevo_nombre;
}
public String getNombre(){
return nombre;
}
public void setValor(int nuevo_valor){
valor=nuevo_valor;
}
public int getValor(){
return valor;
}
}
}
Se terminó de programar el evento click_buscar.
Se realizaron pequeños ajustes.
Información de la versión 1.0:
Se pueden meter datos en dos campos JTextField, uno es texto o cualquier dato.
El otro debe ser un numero.