import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Comparator;
import java.util.PriorityQueue;
import javax.swing.AbstractListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
/**
*
* @author Rafael Angel montero Fernández
* Correo: Sharkyc12@gmail.com
* Ejemplo del uso de tablas de prioridad en Java.
*/
public class Tablas_de_prioridad {
public static void main(String args[]){
Tablas_de_prioridad ejemplo=new Tablas_de_prioridad();
ejemplo.ver();
}
private Formulario frm=new Formulario();
public Tablas_de_prioridad(){
}
public void ver(){
frm.setVisible(true);
}
/**
* Implementacion de Comparator.
* Se usara en PriorityQueue para definir el orden.
*/
public class ComparatorImplementado implements Comparator{
public ComparatorImplementado(){
super();
}
/**
* Usa un casting para pasar los parametros Object o1 y o2 a texto.
* @param o1 Si o1 es menor a o2 entonces, devuelve -1.
* @param o2 Si o1 es mayor a o2 entonces, devuelve 1.
* @return En caso que sean iguales entonces, retorna cero.
*/
@Override
public int compare(Object o1, Object o2) {
String texto1=(String) o1, texto2=(String) o2;
if(texto1.length()<texto2.length()){
return -1;
}else if(texto1.length()>texto2.length()){
return 1;
}
return 0;
}
}
/**
* Se implementa un control personalizado porque se van a usar dos veces 4 controles visuales
* entonces para no repetir el codigo de configuracion de los controles mejor esto.
*/
public class Control_personalizado extends JPanel{
private JList<String> jlstLista_en_desorden= new JList<>();
private JList<String> jlstLista_en_orden= new JList<>();
private JScrollPane jScrollPaneDesorden=new JScrollPane();
private JScrollPane jScrollPaneOrden=new JScrollPane();
private JLabel jlLista_en_orden=new JLabel("Lista en orden"), jlLista_en_desorden=new JLabel("Lista en desorden");
private ModeloList modelo_list_desorden=new ModeloList();
private ModeloList modelo_list_orden=new ModeloList();
/**
* Se guardan los datos ceparados con un espacio.
*/
private String datos_planos="";
/**
* Se usa split para cargar el vector desde datos_planos.
*/
private String[] mDatos_en_desorden={};
public Control_personalizado(){
inicio();
}
public void setBounds(int iz, int top){
this.setBounds(iz, iz, 700, 250);
}
private void inicio(){
setLayout(null);
setSize(new Dimension(700, 250));
//Lista en desorden a la izquierda.
jScrollPaneDesorden.setBounds(0, 100, 155, 100);
jlstLista_en_desorden.setModel(new ModeloList());
this.add(jlstLista_en_desorden);
jlLista_en_desorden.setBounds(0, 70, 150, 25);
jlstLista_en_desorden.setAutoscrolls(true);
add(jlLista_en_desorden);
jScrollPaneDesorden.setViewportView(jlstLista_en_desorden);
add(jScrollPaneDesorden);
//Lista en orden a la derecha.
jScrollPaneOrden.setBounds(170, 100, 155, 100);
jlstLista_en_orden.setModel(new ModeloList());
this.add(jlstLista_en_orden);
jlLista_en_orden.setBounds(170, 70, 150, 25);
jlstLista_en_orden.setAutoscrolls(true);
add(jlLista_en_orden);
jScrollPaneOrden.setViewportView(jlstLista_en_orden);
add(jScrollPaneOrden);
}
/**
* Agrega datos a los controladores de datos.
* @param nuevoControlJTextField
*/
public void add(JTextField nuevoControlJTextField) {
if(datos_planos.isEmpty()==true){
this.datos_planos=nuevoControlJTextField.getText();
}else{
datos_planos+=" " + nuevoControlJTextField.getText();
}
this.mDatos_en_desorden=this.datos_planos.split(" ");
//Datos en desorden.
modelo_list_desorden=new ModeloList(mDatos_en_desorden);
jlstLista_en_desorden.setModel(modelo_list_desorden);
nuevoControlJTextField.setText("");
//Datos en orden usando Comparator y PriorityQueue.
ComparatorImplementado comparador=new ComparatorImplementado();
PriorityQueue<String> tabla_de_prioridad=new PriorityQueue(10, comparador);
//Agregando datos a PriorityQueue.
for(int i=0; i<=mDatos_en_desorden.length-1; i++){
tabla_de_prioridad.add(mDatos_en_desorden[i]);
}
//Volcando (Descargando) los datos en el JList ordenado.
String mDatos_en_orden[]=new String[tabla_de_prioridad.size()];
int cont=0;
while(!tabla_de_prioridad.isEmpty()==true){
mDatos_en_orden[cont]=tabla_de_prioridad.remove();
cont++;
}
modelo_list_orden=new ModeloList(mDatos_en_orden);
jlstLista_en_orden.setModel(modelo_list_orden);
}
}
public class Formulario extends JFrame{
private Control_personalizado tabla_de_prioridad=new Control_personalizado();
private JTextField jtTexto_a_agregar=new JTextField();
private JLabel jlTexto_a_Agregar=new JLabel("Escriba datos");
private JButton jbAdd=new JButton("Add");
private Eventos evt=new Eventos();
public Formulario(){
inicio();
}
private void inicio(){
setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setTitle("Ejemplo AbstractListModel");
this.setBounds(100, 100, 360, 250);
getContentPane().setLayout(null);
setResizable(false);
jlTexto_a_Agregar.setBounds(10, 0, 100, 25);
jtTexto_a_agregar.setBounds(10, 30,150, 30);
jbAdd.setBounds(165, 30,150, 30);
jbAdd.addActionListener(evt);
add(jlTexto_a_Agregar);
add(jbAdd);
add(jtTexto_a_agregar);
tabla_de_prioridad.setBounds(10, 50);
this.add(tabla_de_prioridad);
}
public class Eventos implements ActionListener{
public void click_add(ActionEvent e) {
if(e.getActionCommand().equalsIgnoreCase(jbAdd.getText())==true){
tabla_de_prioridad.add(jtTexto_a_agregar);
}
}
@Override
public void actionPerformed(ActionEvent e) {
this.click_add(e);
}
}
}
/**
* Class que implementa AbstractListModel; en su parametro de la plantilla se puede poner cualquier objeto:
* String, int, double, Object...
*/
public class ModeloList extends AbstractListModel<String>{
public ModeloList(){
super();
String m[]={"Comparator", "PriorityQueue", "AbstractListModel"};
add(m);
}
/**
* Constructor para cargar el vector de una vez.
* @param mNuevos_datos Acepta un vector String.
*/
public ModeloList(String mNuevos_datos[]){
super();
add(mNuevos_datos);
}
/**
* Vector local de datos.
*/
private String mDatos[]={};
/**
* Para agregar un vector externo cargado de datos.
* @param mNuevos_datos
*/
public void add(String mNuevos_datos[]){
mDatos=mNuevos_datos;
}
@Override
public int getSize() {
return mDatos.length;
}
@Override
public String getElementAt(int index) {
return mDatos[index];
}
}
}