import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.AbstractListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
/**
*
* @author Rafael Angel montero Fernández
* Correo: Sharkyc12@gmail.com
*/
public class UsandoAbstractListModel {
private Formulario frm=new Formulario();
public void ver(){ frm.setVisible(true);
}
public static void main(String args[]){ UsandoAbstractListModel ejemplo=new UsandoAbstractListModel();
ejemplo.ver();
}
public UsandoAbstractListModel(){
}
public class Formulario extends JFrame{ /**
* Recordar que a la lista hay que agregarle un JScroll...
*/
private JList<String> jlstDatos= new JList<>();
private JScrollPane jScrollPaneDatos=new JScrollPane();
private JTextField jtCampo=new JTextField();
private JLabel jlTexto_a_Agregar=new JLabel("Escriba datos"), jlLista=new JLabel("Lista de datos"); private JButton jbAdd=new JButton("Add"); private ModeloList modelo_list=new ModeloList();
private Eventos evt=new Eventos();
public Formulario(){ inicio();
}
public void inicio(){ setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setTitle("Ejemplo AbstractListModel"); this.setBounds(100, 100, 350, 250);
getContentPane().setLayout(null);
setResizable(false);
//// jlstDatos.setBounds(150, 100, 155, 100); No es necesario, ya el ScrollPane tiene el setBounds.
jScrollPaneDatos.setBounds(10, 100, 155, 100);
jlstDatos.setModel(new ModeloList());
this.add(jlstDatos);
jlLista.setBounds(10, 70, 100, 25);
jlstDatos.setAutoscrolls(true);
jlTexto_a_Agregar.setBounds(10, 0, 100, 25);
jtCampo.setBounds(10, 30,150, 30);
jbAdd.setBounds(165, 30,150, 30);
jbAdd.addActionListener(evt);
add(jlTexto_a_Agregar);
add(jbAdd);
add(jtCampo);
add(jlLista);
jScrollPaneDatos.setViewportView(jlstDatos);
add(jScrollPaneDatos);
}
public class Eventos implements ActionListener{ /**
* 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[]={};
public void click_add(ActionEvent e) {// jtCampo.setText(e.getActionCommand());
if(e.getActionCommand().equalsIgnoreCase(jbAdd.getText())==true){ if(datos_planos.isEmpty()==true){ this.datos_planos=jtCampo.getText();
}else{ datos_planos+=" " + jtCampo.getText();
}
this.mDatos=this.datos_planos.split(" "); modelo_list=new ModeloList(mDatos);
jlstDatos.setModel(modelo_list);
jtCampo.setText(""); }
}
@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[]={"Hola", "Usando", "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];
}
}
}
Este class ya implementado se pasa por propiedad con JList.setModel(new AbstractListModel(){...});
En mi ejemplo yo no realizo la implementación en forma anónima sino que creo un class real.