Liste deroulante avec saisie semi-auto ???

Liste deroulante avec saisie semi-auto ??? - Java - Programmation

Marsh Posté le 03-06-2004 à 23:14:47    

Salut
 
J'essaie de faire une ptite interface graphique en java...et j'aimerai savoir comment faire une liste deroulante avec saisie semi-auto...
 
En fait donc dans mes listes deroulantes ya deja des choix possible (exemple : {agriculteur, ouvrier, etudiant}) et je voudrais donc pouvoir saisir le debut de mon texte dans la liste puis avoir au fur et a mesure la reduction des choix possibles... dans mon exemple si je tape 'a' dans la liste, il m'apparaitra plus que le choix agriculteur...
 
Je pensais faire ca avec des comboBox mais je vois pas trop comment controler tout ca ...
 
Merci @+

Reply

Marsh Posté le 03-06-2004 à 23:14:47   

Reply

Marsh Posté le 03-06-2004 à 23:31:01    

lis la doc vraiment...
 
JComboBox(Object[] items)  
 
Et comme objet je te recommande des String :D
 
C automatique la propagation...


Message édité par Jubijub le 03-06-2004 à 23:34:44

---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 03-06-2004 à 23:39:27    

...t sur ???
Moi actuellement j'ai juste des listes deroulantes toutes connes :
 
JComboBox combo = new JComboBox();
combo.setEditable(true);
combo.addItem("toto" );
combo.addItem("tata" );
combo.addItem("titi" );
 
et la propagation comme tu dis ne se fait pas...

Reply

Marsh Posté le 03-06-2004 à 23:45:03    

g oublié : setEditable(boolean aFlag)  
 
faut la rendre éditable


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 03-06-2004 à 23:45:35    

Reply

Marsh Posté le 03-06-2004 à 23:53:22    

ben si tu regardes bien je le fe aussi mais comme la propagation comme tu dis ne marche pas...
 
Dans mon post si j'ecris 'ta' dans le box il ne devrait rester dans la liste que "tata" et plus "toto" et "titi"...or ce n'est pas le cas ...
 
Donc doit bien falloir ajouter des trucs

Reply

Marsh Posté le 03-06-2004 à 23:59:33    

dans le tuto l'uneditable marche un peu comme tu veux...si tu ouvres la liste,en tapant ca te choisit le plus proche...
 
sous jBuilder j'utilisais des jdbNavField...mais c orienté bases de données...mais y'avait un équivalent non bd, g perdu le nom...


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 04-06-2004 à 00:02:35    

et ca ?
selectWithKeyChar


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 04-06-2004 à 08:54:27    

bah non malheureusement ... je reexplique vite fait quand le comportement que je desire avoir afin qu'il n'y ait pas de malentendu :
- je tape une lettre, 'a' par exemple
- la liste deroulante s'affiche alors ne laissant que les mots commencant par 'a' dans la liste
- je tape une deuxieme lettre 'b' par exemple
- il ne reste plus que des mots commencant par 'ab' et ainsi de suite...

Reply

Marsh Posté le 04-06-2004 à 12:52:16    

j'ai fait ca un cou avec une zone de texte et une JList et a chaque mise a jour du champ de texte je met à jour la liste. Si aucun choix possible elle est invisible


---------------
pourquoi jamais ca ne va ?
Reply

Marsh Posté le 04-06-2004 à 12:52:16   

Reply

Marsh Posté le 04-06-2004 à 20:33:47    

bon ca a un peu changer ce que je voulais faire ...Mais j'arrive pas encore a le faire ...donc  
Voici ce que je voudrais faire maintenant :
Donc ca part toujours d'un JComboBox editable
Qd je commence a saisir ma chaine, des que je commence a saisir, la premiere chaine qui convient doit apparaitre dans le champs editable... ensuite je continue a saisir...Je tape 1 caractere, si celui ci correspond toujours a la chaine actuelle ca ben je fais juste avance le curseur de saisi...Jusqu'a la fin du mot...
Si le mot n'apparait pas ben je peux saisir normalement...
 
J'ai deja fait un truc mais ca marche pas terrible terrible ...
 

Code :
  1. import javax.swing.*;
  2. import java.awt.event.*;
  3. public class MyComboBox extends JComboBox /*implements KeyListener*/ {
  4. private MyBasicComboBoxEditor editor;
  5. public MyComboBox() {
  6.  setEditable(true);
  7.  editor = new MyBasicComboBoxEditor();
  8.  editor.addKeyListener(new KeyListener()
  9.  {
  10.   public void keyPressed(KeyEvent evt) {
  11.    System.out.println("Presse" );
  12.   }
  13.   public void keyReleased(KeyEvent evt) {
  14.    System.out.println("Relache" );
  15.    System.out.println("New Event" );
  16.    System.out.println(getEditor().getItem().toString());
  17.    if (getEditor().getItem().toString().equals("" )) {
  18.     System.out.println("Editor Vide" );
  19.     //getEditor().setItem(getItemAt(0));
  20.    }
  21.    else {
  22.     for (int i=0;i<getItemCount();i++) {
  23.      int taille = getEditor().getItem().toString().trim().length();
  24.      int taillechaine = getItemAt(i).toString().trim().length();
  25.      System.out.println("Position du curseur : "+editor.getCursorPosition());
  26.      System.out.println("taille :"+taille+"\ntaille2 : "+taillechaine);
  27.      if (taille < taillechaine) {
  28.       if (getEditor().getItem().toString().substring(0,editor.getCursorPosition()).equals(
  29.         getItemAt(i).toString().
  30.         substring(0,taille))) {
  31.         getEditor().setItem(getItemAt(i));
  32.         editor.setCursorPosition(taille);
  33.         setSelectedIndex(i);
  34.       }
  35.       System.out.println("Char : "+evt.getKeyChar());
  36.       if (editor.getCursorPosition() < getEditor().getItem().toString().trim().length()) {
  37.        System.out.println("Char2 : "+getEditor().getItem().toString().trim().charAt(editor.getCursorPosition()));
  38.        if (evt.getKeyChar() == getEditor().getItem().toString().trim().charAt(editor.getCursorPosition())) {
  39.         System.out.println("Meme char" );
  40.         editor.textSelection(editor.getSelectionStart()-1,editor.getSelectionStart());
  41.         editor.replaceSelection("" );
  42.         editor.setCursorPosition(editor.getCursorPosition()+1);
  43.        }
  44.        else {
  45.         editor.textSelection(editor.getSelectionStart(),getEditor().getItem().toString().trim().length());
  46.         //editor.replaceSelection("" );
  47.        }
  48.       }
  49.       //break;
  50.      }
  51.      else {
  52.       System.out.println("Nouvelle chaine" );
  53.      }
  54.     }
  55.    }
  56.   }
  57.   public void keyTyped(KeyEvent evt) {
  58.    System.out.println("Typed" );
  59.   }
  60.  });
  61.  setEditor(editor);
  62. }
  63. public MyComboBox(Object [] array) {
  64.  setEditable(true);
  65.  editor = new MyBasicComboBoxEditor();
  66.  editor.addKeyListener(new KeyListener()
  67.  {
  68.   public void keyPressed(KeyEvent evt) {
  69.    System.out.println("Presse" );
  70.    System.out.println("New Event" );
  71.    System.out.println(getEditor().getItem().toString());
  72.    if (getEditor().getItem().toString().equals("" )) {
  73.     System.out.println("Editor Vide" );
  74.     getEditor().setItem(getItemAt(0));
  75.    }
  76.    else {
  77.     for (int i=0;i<getItemCount();i++) {
  78.      int taille = getEditor().getItem().toString().length();
  79.      int taillechaine = getItemAt(i).toString().length();
  80.      if (taille > taillechaine) {
  81.       if (getEditor().getItem().toString().equals(
  82.         getItemAt(i).toString().
  83.         substring(0,taille))) {
  84.         getEditor().setItem(getItemAt(i));
  85.         setSelectedIndex(i);
  86.         break;
  87.       }
  88.      }
  89.      else {
  90.       System.out.println("Nouvelle chaine" );
  91.      }
  92.     }
  93.    }
  94.   }
  95.   public void keyReleased(KeyEvent evt) {
  96.    System.out.println("Relache" );
  97.   }
  98.   public void keyTyped(KeyEvent evt) {
  99.    System.out.println("Typed" );
  100.   }
  101.  });
  102.  setEditor(editor);
  103.  for (int i = 0;i< array.length;i++) {
  104.   addItem(array[i]);
  105.  }
  106.  //getEditor().setItem(array[0]);
  107. }


 
Et en fait j'ai modifier cette classe pour pouvoir gerer les evenements clavier sur l'editor associé au JComboBox
 

Code :
  1. /*
  2. * Created on 4 juin 2004
  3. *
  4. * To change the template for this generated file go to
  5. * Window - Preferences - Java - Code Generation - Code and Comments
  6. */
  7. package IHM;
  8. /**
  9. * @author Vic
  10. *
  11. * To change the template for this generated type comment go to
  12. * Window - Preferences - Java - Code Generation - Code and Comments
  13. */
  14. /*  
  15. * @(#)BasicComboBoxEditor.java 1.25 03/01/23  
  16. *  
  17. * Copyright 2003 Sun Microsystems, Inc. All rights reserved.  
  18. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.  
  19. */
  20. import javax.swing.*;
  21. import javax.swing.border.Border;
  22. import java.awt.*;
  23. import java.awt.event.*;
  24. import java.lang.reflect.Method;
  25. /**  
  26. * The default editor for editable combo boxes. The editor is implemented as a JTextField.  
  27. *  
  28. * @version 1.25 01/23/03  
  29. * @author Arnaud Weber  
  30. * @author Mark Davidson  
  31. */
  32. public class MyBasicComboBoxEditor implements ComboBoxEditor,FocusListener {
  33. protected JTextField editor;
  34. private Object oldValue;
  35. public MyBasicComboBoxEditor() {
  36.  editor = new BorderlessTextField("",9);
  37.  editor.setBorder(null);
  38. }
  39. public Component getEditorComponent() {
  40.  return editor;
  41. }
  42. /**
  43.  *  
  44.  * @param i
  45.  */
  46. public void setCursorPosition(int i) {
  47.  editor.setCaretPosition(i);
  48. }
  49. /**
  50.  *  
  51.  * @return
  52.  */
  53. public int getCursorPosition() {
  54.  return editor.getCaretPosition();
  55. }
  56. /**
  57.  *  
  58.  * @param start
  59.  * @param end
  60.  */
  61. public void textSelection(int start,int end) {
  62.  editor.select(start,end);
  63. }
  64. /**
  65.  *  
  66.  * @param string
  67.  */
  68. public void replaceSelection(String string) {
  69.  editor.replaceSelection(string);
  70. }
  71. /**
  72.  *  
  73.  * @return
  74.  */
  75. public int getSelectionStart() {
  76.  return editor.getSelectionStart();
  77. }
  78. /**
  79.  *  
  80.  * @return
  81.  */
  82. public int getSelectionEnd() {
  83.  return editor.getSelectionEnd();
  84. }
  85. /**   
  86.  * Sets the item that should be edited.   
  87.  *  
  88.  * @param anObject the displayed value of the editor  
  89.  */
  90. public void setItem(Object anObject) {
  91.  if ( anObject != null )  {
  92.   editor.setText(anObject.toString());
  93.   oldValue = anObject;
  94.  } else {
  95.   editor.setText("" );
  96.  }
  97. }
  98. public Object getItem() {
  99.  Object newValue = editor.getText();
  100.  if (oldValue != null && !(oldValue instanceof String))  {
  101.   // The original value is not a string. Should return the value in it's  
  102.   // original type.  
  103.   if (newValue.equals(oldValue.toString()))  {
  104.    return oldValue;
  105.   } else {
  106.    // Must take the value from the editor and get the value and cast it to the new type.  
  107.    Class cls = oldValue.getClass();
  108.    try {
  109.     Method method = cls.getMethod("valueOf", new Class[]{String.class});
  110.     newValue = method.invoke(oldValue, new Object[] { editor.getText()});
  111.    } catch (Exception ex) {
  112.     // Fail silently and return the newValue (a String object)  
  113.    }
  114.   }
  115.  }
  116.  return newValue;
  117. }
  118. public void selectAll() {
  119.  editor.selectAll();
  120.  editor.requestFocus();
  121. }
  122. // This used to do something but now it doesn't.  It couldn't be  
  123. // removed because it would be an API change to do so.  
  124. public void focusGained(FocusEvent e) {}
  125. // This used to do something but now it doesn't.  It couldn't be  
  126. // removed because it would be an API change to do so.  
  127. public void focusLost(FocusEvent e) {}
  128. public void addActionListener(ActionListener l) {
  129.  editor.addActionListener(l);
  130. }
  131. public void removeActionListener(ActionListener l) {
  132.  editor.removeActionListener(l);
  133. }
  134. public void addKeyListener(KeyListener k) {
  135.  editor.addKeyListener(k);
  136. }
  137. public void removeKeyListener(KeyListener k) {
  138.  editor.removeKeyListener(k);
  139. }
  140. static class BorderlessTextField extends JTextField {
  141.  public BorderlessTextField(String value,int n) {
  142.   super(value,n);
  143.  }
  144.  // workaround for 4530952  
  145.  public void setText(String s) {
  146.   if (getText().equals(s)) {
  147.    return;
  148.   }
  149.   super.setText(s);
  150.  }
  151.  public void setBorder(Border b) {}
  152. }
  153. /**  
  154.  * A subclass of BasicComboBoxEditor that implements UIResource.  
  155.  * BasicComboBoxEditor doesn't implement UIResource  
  156.  * directly so that applications can safely override the  
  157.  * cellRenderer property with BasicListCellRenderer subclasses.  
  158.  * <p>  
  159.  * <strong>Warning:</strong>  
  160.  * Serialized objects of this class will not be compatible with  
  161.  * future Swing releases. The current serialization support is  
  162.  * appropriate for short term storage or RMI between applications running  
  163.  * the same version of Swing.  As of 1.4, support for long term storage  
  164.  * of all JavaBeans<sup><font size="-2">TM</font></sup>  
  165.  * has been added to the <code>java.beans</code> package.  
  166.  * Please see {@link java.beans.XMLEncoder}.  
  167.  */
  168. public static class UIResource extends MyBasicComboBoxEditor
  169. implements javax.swing.plaf.UIResource {
  170. }
  171. }


Message édité par boubavic le 04-06-2004 à 20:51:26
Reply

Marsh Posté le 05-06-2004 à 15:34:37    

up, ca m'intéresse de savoir si qqn a une solution...le pire c que c parfaitement implémenté dans les composants jBuilder...donc ca a été fait...


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 06-06-2004 à 21:18:43    

ben pour l'instant ma solution marche pas au top ... si vous voulez l'essayer allez y ...et si vous trouvez comment la terminer ca sera encore mieux  ;) ... moi je crois que je vais passer a autre chose pour l'instant ...me suis deja assez pris la tete dessus...

Reply

Marsh Posté le 07-06-2004 à 00:13:49    

oué ,c pas evident a developper ton truc.
peut etre qu'un jour ce sera en natif pour l'instant...
 
je pense que la meilleurs solution c'est de passer par une jlist en fait.
elle s'afficherai juste en dessous et tu lui ajoutera a la volé tout les item possible.
 
 
bref, bon courrage :/


Message édité par veryfree le 07-06-2004 à 00:14:03
Reply

Marsh Posté le 07-06-2004 à 08:33:41    

personne n'a tester ma classe ?

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed