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.