Foro sobre Java SE > Ayuda con Autocompletado
Todavia no puedo resolverlo... alguien que me de una mano con este codigo... ya que este autocomplete se acomoda ami necesidad, pero tengo un error, en que se me cruza...
solamente para que me funciones en varios jtexfield.. tengo que crear varias clases Autocompletar y destinando cada clase para cada jtexfield, pero eso no es correcto...
Hay dos problemas: uno en la clase AutoCompletar y otro en Prueba.
1.- Elimina todas las referencias static en AutoCompletar. Es lo que causa que solo funcione una única instancia de AutoCompletar.
2.- Usa diferentes variables para las instancias de AutoCompletar en Prueba. Tal y como lo tienes, usas la misma para ambos JTextField.
Al margen de esto, procura seguir las convenciones sintácticas de Java: las variables empiezan con letra minúscula.
Siguen nuevas versiones mejoradas de ambas clases.
import java.util.ArrayList;
import javax.swing.DefaultComboBoxModel;
public class Prueba extends javax.swing.JFrame {
private AutoCompletar autoMarcas, autoProductos;
private final DefaultComboBoxModel modeloComboMarca;
private final DefaultComboBoxModel modeloComboProductos;
private ArrayList<String> itemsMarca;
private ArrayList<String> itemsTipoProducto;
/**
Creates new formodeloComboProductos Prueba
*/
public Prueba() {
this.modeloComboMarca = new DefaultComboBoxModel();
this.modeloComboProductos = new DefaultComboBoxModel();
this.itemsTipoProducto = new ArrayList<>();
this.itemsMarca = new ArrayList<>();
initComponents();
AutocompleatadoMarca();
AutocompleatadoTipoProducto();
}
private void AutocompleatadoMarca() {
autoMarcas = new AutoCompletar(modeloComboMarca, jtxtMarca);
itemsMarca.clear();
itemsMarca.add("MERCEDES");
itemsMarca.add("TOYOTA");
itemsMarca.add("KIA");
itemsMarca.add("MAZDA3");
itemsMarca.add("HONDA");
autoMarcas.setupAutoComplete(itemsMarca);
}
private void AutocompleatadoTipoProducto() {
autoProductos = new AutoCompletar(modeloComboProductos, jtxtTipoProducto);
itemsTipoProducto.clear();
itemsTipoProducto.add("AUTOMOVIL");
itemsTipoProducto.add("MOTO LINEAL");
itemsTipoProducto.add("CAMION");
itemsTipoProducto.add("CAMIONETA");
autoProductos.setupAutoComplete(itemsTipoProducto);
}
/**
This modeloComboProductosethod is called fromodeloComboProductos within the constructor to initialize the formodeloComboProductos.
WARNING: Do NOT modeloComboProductosodify this code. The content of this modeloComboProductosethod is always
regenerated by the FormodeloComboProductos Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jtxtMarca = new javax.swing.JTextField();
jtxtTipoProducto = new javax.swing.JTextField();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(20, 20, 20)
.addComponent(jtxtMarca, javax.swing.GroupLayout.PREFERRED_SIZE, 155, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(38, 38, 38)
.addComponent(jtxtTipoProducto, javax.swing.GroupLayout.PREFERRED_SIZE, 162, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(25, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(91, 91, 91)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jtxtMarca, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jtxtTipoProducto, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addContainerGap(189, Short.MAX_VALUE))
);
pack();
}// </editor-fold>
/**
@param args the comodeloComboProductosmodeloComboProductosand line argumodeloComboProductosents
*/
public static void main(String args[]) {
/* Set the Nimbus look and feel */
//<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
/* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
* For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
*/
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException ex) {
java.util.logging.Logger.getLogger(Prueba.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (InstantiationException ex) {
java.util.logging.Logger.getLogger(Prueba.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
java.util.logging.Logger.getLogger(Prueba.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(Prueba.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
//</editor-fold>
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Prueba().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JTextField jtxtMarca;
private javax.swing.JTextField jtxtTipoProducto;
// End of variables declaration
}
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import javax.swing.ComboBoxModel;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JTextField;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
/**
<p>
@author Carlos
*/
public class AutoCompletar {
private final DefaultComboBoxModel modelo;
private KeyAdapter keyAdapter;
private final JTextField txtInput;
private JComboBox cbInput;
/**
<p>
@param modelo
@param txtInputt
*/
public AutoCompletar(DefaultComboBoxModel modelo, JTextField txtInputt) {
this.modelo = modelo;
this.txtInput = txtInputt;
}
/**
<p>
*/
public void ElimacionKeyListener() {
txtInput.removeKeyListener(keyAdapter);
}
/**
<p>
@param items
*/
public void setupAutoComplete(final ArrayList<String> items) {
cbInput = new JComboBoxImpl(modelo);
modelo.removeAllElements();
setAdjusting(false);
for (String item : items) {
modelo.addElement(item);
}
cbInput.setSelectedItem(null);
cbInput.addActionListener(new ActionListenerImpl());
keyAdapter = new KeyAdapterImpl();
txtInput.addKeyListener(keyAdapter);
txtInput.getDocument().addDocumentListener(new DocumentListenerImpl(items));
txtInput.setLayout(new BorderLayout());
txtInput.add(cbInput, BorderLayout.SOUTH);
}
private void setAdjusting(boolean adjusting) {
cbInput.putClientProperty("is_adjusting", adjusting);
}
private class DocumentListenerImpl implements DocumentListener {
private final ArrayList<String> items;
DocumentListenerImpl(ArrayList<String> items) {
this.items = items;
}
@Override
public void insertUpdate(DocumentEvent e) {
updateList();
}
@Override
public void removeUpdate(DocumentEvent e) {
updateList();
}
@Override
public void changedUpdate(DocumentEvent e) {
updateList();
}
private void updateList() {
setAdjusting(true);
modelo.removeAllElements();
String input = txtInput.getText();
if (!input.isEmpty() || input.isEmpty()) {
for (String item : items) {
if (item.toLowerCase().contains(input.toLowerCase())) {
modelo.addElement(item);
cbInput.setPopupVisible(modelo.getSize() < 0);
}
}
}
if (!input.isEmpty()) {
cbInput.setPopupVisible(modelo.getSize() > 0);
setAdjusting(false);
}
}
}
private class KeyAdapterImpl extends KeyAdapter {
@Override
public void keyPressed(KeyEvent e) {
setAdjusting(true);
if (e.getKeyCode() == KeyEvent.VK_DOWN || e.getKeyCode() == KeyEvent.VK_UP) {
cbInput.setPopupVisible(true);
}
if (cbInput.isPopupVisible()) {
if (e.getKeyCode() == KeyEvent.VK_ENTER || e.getKeyCode() == KeyEvent.VK_UP || e.getKeyCode() == KeyEvent.VK_DOWN) {
e.setSource(cbInput);
cbInput.dispatchEvent(e);
if (e.getKeyCode() == KeyEvent.VK_ENTER) {
txtInput.setText(cbInput.getSelectedItem().toString());
cbInput.setPopupVisible(false);
}
}
}
if (e.getKeyCode() == KeyEvent.VK_ESCAPE) {
cbInput.setPopupVisible(false);
}
setAdjusting(false);
}
}
private class ActionListenerImpl implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
if (!isAdjusting()) {
if (cbInput.getSelectedItem() != null) {
txtInput.setText(cbInput.getSelectedItem().toString());
}
}
}
private boolean isAdjusting() {
if (cbInput.getClientProperty("is_adjusting") instanceof Boolean) {
return (Boolean) cbInput.getClientProperty("is_adjusting");
}
return false;
}
}
private class JComboBoxImpl extends JComboBox {
JComboBoxImpl(ComboBoxModel aModel) {
super(aModel);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(super.getPreferredSize().width, 0);
}
}
}
Gracias choces...
ahora tengo un nuevo problema...
eh creado dos bontones de "CANCELAR" y "NUEVO"
en el boton nuevo me estan los metodos
AutocompleatadoMarca();
AutocompleatadoTipoProducto();
mas unos juegos de botones
lo que pasa es que cuando doy por primera vez en nuevo todo normal... pero a la segunda vez me sale error y el AutoCompletar no funciona del todo bien...
y si e implementado este boton nuevo ya que lo de autocompletar ba estar conectada a una base de datos.. y si se agrega uno nuevo a la hora de dar en nuevo se tiene que actulizar el contenido...
ahorita estoy haciendo la prueba en frame de prueba.. pero como aria para que cuando de en el boton Nuevo se carguen nuevamente los datos del arraylist y se aga una nueva instancia de la clase sin generar errores sin que salgan errores
codigo::::::::::::::::::::::::::::::::
/* Set the Nimbus look and feel */
//<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
/* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
* For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
*/
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException ex) {
java.util.logging.Logger.getLogger(Prueba.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (InstantiationException ex) {
java.util.logging.Logger.getLogger(Prueba.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
java.util.logging.Logger.getLogger(Prueba.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(Prueba.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
//</editor-fold>
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Prueba().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JButton jbtnCancelar;
private javax.swing.JButton jbtnNuevo;
private javax.swing.JTextField jtxtMarca;
private javax.swing.JTextField jtxtTipoProducto;
// End of variables declaration
}
Gracias!
disculpa no pude pegar bien el codigo que tengo...
codigo::::::::::::::::::::::::::::::::::::::
import java.util.ArrayList;
import javax.swing.DefaultComboBoxModel;
/**
*
* @author Administrador
*/
public class Prueba extends javax.swing.JFrame {
private AutoCompletar1 autoMarcas, autoProductos;
private final DefaultComboBoxModel modeloComboMarca;
private final DefaultComboBoxModel modeloComboProductos;
private ArrayList<String> itemsMarca;
private ArrayList<String> itemsTipoProducto;
/**
* Creates new form Prueba
*/
public Prueba() {
this.modeloComboMarca = new DefaultComboBoxModel();
this.modeloComboProductos = new DefaultComboBoxModel();
this.itemsTipoProducto = new ArrayList<>();
this.itemsMarca = new ArrayList<>();
initComponents();
this.jtxtMarca.setText(null);
this.jtxtTipoProducto.setText(null);
this.jtxtMarca.setEnabled(false);
this.jtxtTipoProducto.setEnabled(false);
}
private void AutocompleatadoMarca() {
autoMarcas = new AutoCompletar1(modeloComboMarca, jtxtMarca);
itemsMarca.clear();
itemsMarca.add("MERCEDES");
itemsMarca.add("TOYOTA");
itemsMarca.add("KIA");
itemsMarca.add("MAZDA3");
itemsMarca.add("HONDA");
autoMarcas.setupAutoComplete(itemsMarca);
}
private void AutocompleatadoTipoProducto() {
autoProductos = new AutoCompletar1(modeloComboProductos, jtxtTipoProducto);
itemsTipoProducto.clear();
itemsTipoProducto.add("AUTOMOVIL");
itemsTipoProducto.add("MOTO LINEAL");
itemsTipoProducto.add("CAMION");
itemsTipoProducto.add("CAMIONETA");
autoProductos.setupAutoComplete(itemsTipoProducto);
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jtxtMarca = new javax.swing.JTextField();
jtxtTipoProducto = new javax.swing.JTextField();
jbtnNuevo = new javax.swing.JButton();
jbtnCancelar = new javax.swing.JButton();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
jbtnNuevo.setText("NUEVO");
jbtnNuevo.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jbtnNuevoActionPerformed(evt);
}
});
jbtnCancelar.setText("CANCELAR");
jbtnCancelar.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jbtnCancelarActionPerformed(evt);
}
});
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(23, 23, 23)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
.addComponent(jtxtMarca)
.addComponent(jbtnCancelar, javax.swing.GroupLayout.DEFAULT_SIZE, 159, Short.MAX_VALUE))
.addGap(18, 18, 18)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
.addComponent(jbtnNuevo, javax.swing.GroupLayout.DEFAULT_SIZE, 164, Short.MAX_VALUE)
.addComponent(jtxtTipoProducto))
.addContainerGap(36, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(91, 91, 91)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jtxtMarca, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jtxtTipoProducto, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(42, 42, 42)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jbtnNuevo)
.addComponent(jbtnCancelar))
.addContainerGap(124, Short.MAX_VALUE))
);
pack();
}// </editor-fold>
private void jbtnNuevoActionPerformed(java.awt.event.ActionEvent evt) {
this.jtxtMarca.setText(null);
this.jtxtTipoProducto.setText(null);
this.jtxtMarca.setEnabled(true);
this.jtxtTipoProducto.setEnabled(true);
AutocompleatadoMarca();
AutocompleatadoTipoProducto();
}
private void jbtnCancelarActionPerformed(java.awt.event.ActionEvent evt) {
autoProductos.ElimacionKeyListener();
autoMarcas.ElimacionKeyListener();
this.jtxtMarca.setText(null);
this.jtxtTipoProducto.setText(null);
this.jtxtMarca.setEnabled(false);
this.jtxtTipoProducto.setEnabled(false);
}
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
/* Set the Nimbus look and feel */
//<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
/* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
* For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
*/
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException ex) {
java.util.logging.Logger.getLogger(Prueba.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (InstantiationException ex) {
java.util.logging.Logger.getLogger(Prueba.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
java.util.logging.Logger.getLogger(Prueba.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(Prueba.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
//</editor-fold>
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Prueba().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JButton jbtnCancelar;
private javax.swing.JButton jbtnNuevo;
private javax.swing.JTextField jtxtMarca;
private javax.swing.JTextField jtxtTipoProducto;
// End of variables declaration
}
Voy a mirarlo con detenimiento, porque esa clase AutoCompletar es un poco "frankestein" :)
Es inevitable hacerle bastantes modificaciones. Mañana te digo algo.
frankestein xD.. ok espero tu respuesta.. y ojala me puedas ayudar.. Gracias
"frankestein": hecho con trozos, feo y da miedo :)
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import javax.swing.ComboBoxModel;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JTextField;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
/**
<p>
@author Carlos
*/
public class AutoCompletar2 {
private final DefaultComboBoxModel<String> modelo;
private final JTextField txtInput;
private final JComboBox<String> cbInput;
private final DocumentListenerImpl documentListener;
/**
<p>
@param txtInputt
*/
public AutoCompletar2(JTextField txtInputt) {
this.txtInput = txtInputt;
modelo = new DefaultComboBoxModel<>();
cbInput = new JComboBoxImpl(modelo);
cbInput.setSelectedItem(null);
cbInput.addActionListener(new ActionListenerImpl());
txtInput.addKeyListener(new KeyAdapterImpl());
documentListener = new DocumentListenerImpl();
txtInput.getDocument().addDocumentListener(documentListener);
txtInput.setLayout(new BorderLayout());
txtInput.add(cbInput, BorderLayout.SOUTH);
}
/**
<p>
@param items
*/
public void setupAutoComplete(final List<String> items) {
documentListener.añadirItems(items);
modelo.removeAllElements();
setAdjusting(false);
for (String item : items) {
modelo.addElement(item);
}
cbInput.setSelectedItem(null);
txtInput.setText(null);
}
private void setAdjusting(boolean adjusting) {
cbInput.putClientProperty("is_adjusting", adjusting);
}
private static class JComboBoxImpl extends JComboBox<String> {
private static final long serialVersionUID = -1758572388906268539L;
JComboBoxImpl(ComboBoxModel<String> aModel) {
super(aModel);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(super.getPreferredSize().width, 0);
}
}
private class DocumentListenerImpl implements DocumentListener {
private List<String> items;
private void añadirItems(final List<String> items) {
this.items = new ArrayList<>(items);
}
@Override
public void insertUpdate(DocumentEvent e) {
updateList();
}
@Override
public void removeUpdate(DocumentEvent e) {
updateList();
}
@Override
public void changedUpdate(DocumentEvent e) {
updateList();
}
private void updateList() {
setAdjusting(true);
modelo.removeAllElements();
String input = txtInput.getText();
boolean empty = input.isEmpty();
if (!empty || empty) {
Locale locale = Locale.getDefault();
for (String item : items) {
if (item.toLowerCase(locale).contains(input.toLowerCase(locale))) {
modelo.addElement(item);
cbInput.setPopupVisible(modelo.getSize() < 0);
}
}
}
if (!empty) {
cbInput.setPopupVisible(modelo.getSize() > 0);
setAdjusting(false);
}
}
}
private class KeyAdapterImpl extends KeyAdapter {
@Override
public void keyPressed(KeyEvent e) {
setAdjusting(true);
int code = e.getKeyCode();
if (code == KeyEvent.VK_DOWN || code == KeyEvent.VK_UP) {
cbInput.setPopupVisible(true);
}
if (cbInput.isPopupVisible()) {
if (code == KeyEvent.VK_ENTER || code == KeyEvent.VK_UP || code == KeyEvent.VK_DOWN) {
e.setSource(cbInput);
cbInput.dispatchEvent(e);
if (code == KeyEvent.VK_ENTER) {
txtInput.setText(cbInput.getSelectedItem().toString());
cbInput.setPopupVisible(false);
}
}
}
if (code == KeyEvent.VK_ESCAPE) {
cbInput.setPopupVisible(false);
}
setAdjusting(false);
}
}
private class ActionListenerImpl implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
if (!isAdjusting()) {
if (cbInput.getSelectedItem() != null) {
txtInput.setText(cbInput.getSelectedItem().toString());
}
}
}
private boolean isAdjusting() {
return cbInput.getClientProperty("is_adjusting") instanceof Boolean ? (Boolean) cbInput.getClientProperty("is_adjusting") : false;
}
}
}
import java.util.ArrayList;
public class Prueba extends javax.swing.JFrame {
private static final long serialVersionUID = 7510262562109501827L;
/**
@param args the command line arguments
*/
public static void main(String args[]) {
/* Set the Nimbus look and feel */
//<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
/* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
* For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
*/
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException ex) {
java.util.logging.Logger.getLogger(Prueba.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (InstantiationException ex) {
java.util.logging.Logger.getLogger(Prueba.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
java.util.logging.Logger.getLogger(Prueba.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(Prueba.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
//</editor-fold>
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new Prueba().setVisible(true);
}
});
}
private final AutoCompletar2 autoMarcas, autoProductos;
private final ArrayList<String> itemsMarca;
private final ArrayList<String> itemsTipoProducto;
// Variables declaration - do not modify
private javax.swing.JButton jbtnCancelar;
private javax.swing.JButton jbtnNuevo;
private javax.swing.JTextField jtxtMarca;
private javax.swing.JTextField jtxtTipoProducto;
// End of variables declaration
/**
Creates new form Prueba
*/
public Prueba() {
this.itemsTipoProducto = new ArrayList<>();
this.itemsMarca = new ArrayList<>();
initComponents();
this.jtxtMarca.setText(null);
this.jtxtTipoProducto.setText(null);
this.jtxtMarca.setEnabled(false);
this.jtxtTipoProducto.setEnabled(false);
autoMarcas = new AutoCompletar2(jtxtMarca);
autoProductos = new AutoCompletar2(jtxtTipoProducto);
}
private void autocompletadoMarca() {
itemsMarca.clear();
itemsMarca.add("MERCEDES");
itemsMarca.add("TOYOTA");
itemsMarca.add("KIA");
itemsMarca.add("MAZDA3");
itemsMarca.add("HONDA");
autoMarcas.setupAutoComplete(itemsMarca);
}
private void autocompletadoTipoProducto() {
itemsTipoProducto.clear();
itemsTipoProducto.add("AUTOMOVIL");
itemsTipoProducto.add("MOTO LINEAL");
itemsTipoProducto.add("CAMION");
itemsTipoProducto.add("CAMIONETA");
autoProductos.setupAutoComplete(itemsTipoProducto);
}
/**
This method is called from within the constructor to initialize the form.
WARNING: Do NOT modify this code. The content of this method is always
regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jtxtMarca = new javax.swing.JTextField();
jtxtTipoProducto = new javax.swing.JTextField();
jbtnNuevo = new javax.swing.JButton();
jbtnCancelar = new javax.swing.JButton();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
jbtnNuevo.setText("NUEVO");
jbtnNuevo.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jbtnNuevoActionPerformed(evt);
}
});
jbtnCancelar.setText("CANCELAR");
jbtnCancelar.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jbtnCancelarActionPerformed(evt);
}
});
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(23, 23, 23)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
.addComponent(jtxtMarca)
.addComponent(jbtnCancelar, javax.swing.GroupLayout.DEFAULT_SIZE, 159, Short.MAX_VALUE))
.addGap(18, 18, 18)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
.addComponent(jbtnNuevo, javax.swing.GroupLayout.DEFAULT_SIZE, 164, Short.MAX_VALUE)
.addComponent(jtxtTipoProducto))
.addContainerGap(36, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(91, 91, 91)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jtxtMarca, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jtxtTipoProducto, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(42, 42, 42)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jbtnNuevo)
.addComponent(jbtnCancelar))
.addContainerGap(124, Short.MAX_VALUE))
);
pack();
}// </editor-fold>
private void jbtnNuevoActionPerformed(java.awt.event.ActionEvent evt) {
this.jtxtMarca.setText(null);
this.jtxtTipoProducto.setText(null);
this.jtxtMarca.setEnabled(true);
this.jtxtTipoProducto.setEnabled(true);
autocompletadoMarca();
autocompletadoTipoProducto();
}
private void jbtnCancelarActionPerformed(java.awt.event.ActionEvent evt) {
this.jtxtMarca.setText(null);
this.jtxtTipoProducto.setText(null);
this.jtxtMarca.setEnabled(false);
this.jtxtTipoProducto.setEnabled(false);
}
}
Gracias choces, con la clase que colocaste pude resolverlo..
una pregunta respecto al JTable, en el hay un evento que capture si se agreo o se elimino una fila?
esque estoy implementado un jtable que si tiene como minimo una fila agregada se habilite el boton guardar... si no tiene ninguna.. el boton no se habilita..
sabes como puedo hacer eso?
eh probado con el evento addAncestorListener pense que podia hacer con ese evento.. pero nada..
sabes como puedo implementarlo?
Gracias!!
No sé que haya un evento del tipo que mencionas: agregar o eliminar una fila.
Lo que si existe es un TableModelListener, por ejemplo:
jTable1.getModel().addTableModelListener(new TableModelListener() {
public void tableChanged(TableModelEvent e) {
if(e.getType() == e.UPDATE){
// la tabla se ha modificado
}
}
});
que permite saber qué tipo de evento se ha disparado con un cambio en la tabla.
http://docs.oracle.com/javase/7/docs/api/javax/swing/event/TableModelEvent.html#getType()
Dentro de ese método puedes comprobar el tamaño del modelo de la tabla, para saber si hay filas o no.
Gracias choces... es como dijiste TableModelListener.
Buenas que tal...
eh contradado un codigo por la red, es sobre el autocompletado en java.
lo modifique un poco, deacuerdo ami necesidad,
pero ahora tengo un problema..
la clase con el codigo solamente me funciona en la primera instacia que ago en un texfield..
cuando trato de hacerlo en otro textfield no funciona... a continuacion el codigo de la clase AutoCompletar:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
/**
*
* @author Administrador
*/
public class AutoCompletar {
private static DefaultComboBoxModel Modelo;
private static KeyAdapter KeyAdapter;
private static JTextField txtInput;
private static JComboBox cbInput;
public AutoCompletar(DefaultComboBoxModel Modelo, KeyAdapter KeyAdapter, JTextField txtInput, JComboBox cbInput) {
this.Modelo = Modelo;
this.KeyAdapter = KeyAdapter;
this.txtInput = txtInput;
this.cbInput = cbInput;
}
private static void CreacionKeyAdapter(final JComboBox cbInput) {
KeyAdapter = new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
setAdjusting(true);
if (e.getKeyCode() == KeyEvent.VK_DOWN || e.getKeyCode() == KeyEvent.VK_UP) {
cbInput.setPopupVisible(true);
}
if (cbInput.isPopupVisible()) {
if (e.getKeyCode() == KeyEvent.VK_ENTER || e.getKeyCode() == KeyEvent.VK_UP || e.getKeyCode() == KeyEvent.VK_DOWN) {
e.setSource(cbInput);
cbInput.dispatchEvent(e);
if (e.getKeyCode() == KeyEvent.VK_ENTER) {
txtInput.setText(cbInput.getSelectedItem().toString());
cbInput.setPopupVisible(false);
}
}
}
if (e.getKeyCode() == KeyEvent.VK_ESCAPE) {
cbInput.setPopupVisible(false);
}
setAdjusting(false);
}
};
}
public void ElimacionKeyListener() {
txtInput.removeKeyListener(KeyAdapter);
}
private static boolean isAdjusting() {
if (cbInput.getClientProperty("is_adjusting") instanceof Boolean) {
return (Boolean) cbInput.getClientProperty("is_adjusting");
}
return false;
}
private static void setAdjusting(boolean adjusting) {
cbInput.putClientProperty("is_adjusting", adjusting);
}
public static void setupAutoComplete(final ArrayList<String> items
) {
cbInput = new JComboBox(Modelo) {
public Dimension getPreferredSize() {
return new Dimension(super.getPreferredSize().width, 0);
}
};
Modelo.removeAllElements();
setAdjusting(false);
for (String item : items) {
Modelo.addElement(item);
}
cbInput.setSelectedItem(null);
cbInput.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (!isAdjusting()) {
if (cbInput.getSelectedItem() != null) {
txtInput.setText(cbInput.getSelectedItem().toString());
}
}
}
});
CreacionKeyAdapter(cbInput);
txtInput.addKeyListener(KeyAdapter);
txtInput.getDocument().addDocumentListener(new DocumentListener() {
public void insertUpdate(DocumentEvent e) {
updateList();
}
public void removeUpdate(DocumentEvent e) {
updateList();
}
public void changedUpdate(DocumentEvent e) {
updateList();
}
private void updateList() {
setAdjusting(true);
Modelo.removeAllElements();
String input = txtInput.getText();
if (!input.isEmpty() || input.isEmpty()) {
for (String item : items) {
if (item.toLowerCase().contains(input.toLowerCase())) {
Modelo.addElement(item);
cbInput.setPopupVisible(Modelo.getSize() < 0);
}
}
}
if (!input.isEmpty()) {
try {
cbInput.setPopupVisible(Modelo.getSize() > 0);
} catch (Exception E) {
}
setAdjusting(false);
}
}
});
txtInput.setLayout(new BorderLayout());
txtInput.add(cbInput, BorderLayout.SOUTH);
}
}
Acontinuacion la Clase Prueba:
import java.awt.event.KeyAdapter;
import java.util.ArrayList;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
/**
*
* @author Administrador
*/
public class Prueba extends javax.swing.JFrame {
private AutoCompletar AU;
private KeyAdapter KeyAdapterMarca;
private KeyAdapter KeyAdapterTipoProducto;
private JComboBox ComboMarca;
private JComboBox ComboTiproProducto;
private DefaultComboBoxModel ModeloComboMarca = new DefaultComboBoxModel();
private DefaultComboBoxModel ModeloComboTipoProducto = new DefaultComboBoxModel();
private ArrayList<String> ItemsMarca = new ArrayList<>();
private ArrayList<String> ItemsTipoProducto = new ArrayList<>();
/**
* Creates new form Prueba
*/
public Prueba() {
initComponents();
AutocompleatadoTipoProducto();
AutocompleatadoMarca();
}
public void AutocompleatadoMarca() {
AU = new AutoCompletar(ModeloComboMarca, KeyAdapterMarca, jtxtMarca, ComboMarca);
ItemsMarca.clear();
ItemsMarca.add("MERCEDES");
ItemsMarca.add("TOYOTA");
ItemsMarca.add("KIA");
ItemsMarca.add("MAZDA3");
ItemsMarca.add("HONDA");
AU.setupAutoComplete(ItemsMarca);
}
public void AutocompleatadoTipoProducto() {
AU = new AutoCompletar(ModeloComboTipoProducto, KeyAdapterTipoProducto, jtxtTipoProducto, ComboTiproProducto);
ItemsTipoProducto.clear();
ItemsTipoProducto.add("AUTOMOVIL");
ItemsTipoProducto.add("MOTO LINEAL");
ItemsTipoProducto.add("CAMION");
ItemsTipoProducto.add("CAMIONETA");
AU.setupAutoComplete(ItemsTipoProducto);
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jtxtMarca = new javax.swing.JTextField();
jtxtTipoProducto = new javax.swing.JTextField();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(20, 20, 20)
.addComponent(jtxtMarca, javax.swing.GroupLayout.PREFERRED_SIZE, 155, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(38, 38, 38)
.addComponent(jtxtTipoProducto, javax.swing.GroupLayout.PREFERRED_SIZE, 162, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(25, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(91, 91, 91)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jtxtMarca, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jtxtTipoProducto, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addContainerGap(189, Short.MAX_VALUE))
);
pack();
}// </editor-fold>
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
/* Set the Nimbus look and feel */
//<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
/* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
* For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
*/
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException ex) {
java.util.logging.Logger.getLogger(Prueba.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (InstantiationException ex) {
java.util.logging.Logger.getLogger(Prueba.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
java.util.logging.Logger.getLogger(Prueba.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(Prueba.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
//</editor-fold>
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Prueba().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JTextField jtxtMarca;
private javax.swing.JTextField jtxtTipoProducto;
// End of variables declaration
}
Lo que pasa es que solo funciona en el primero que se instancia en mi codigo, Prueba el primero que se instancia es AutocompleatadoTipoProducto();
no se como solucionarlo para que funciones en varios texfield sin ningun problema.... Gracias.