Announcement

Collapse
No announcement yet.

Intelligente JComboBox ?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Intelligente JComboBox ?

    Hallo,
    Kennt vielleicht jemand einen Nachfahren einer JComboBox,
    der ein eingabautes "Auto-Vervollständigen" analog zur
    Netscape-URL-Eingabe (oder auch wie beim MS-Internet-Explorer, wenns nicht anders geht)
    beinhaltet?

    Beim Eintippen soll also immer ein passender, in der JCombobox
    enthaltener Wert ergänzt werden.

    Die normale JComboBox macht sowas ja leider nur beim 1.Buchstaben.

    Gruß
    Alex

  • #2
    Hallo Alexander

    Die Klasse JComboBox implementiert leider nicht das Interface des TextListener. Man kann also nicht die textValueChanged-Methode überschreiben. Diese brauchst Du aber um Dein Problem zu lösen.

    Eine Lösung wäre eine eigene Klasse zu schreiben, bei der von JComboBox abgeleitet wird und das Interface TextListener zu implementieren.

    Zweite Möglichkeit: Du verwendest zusätzlich ein TextField (dieses besitzt die Methode addTextListener) - bei der swing-Komponente JTextField hat man die woll vergessen. Bei Eingabe von Zeichen im TextField wird die richtige Stelle in der JComboBox angesprungen. Der user sollte in der JComboBox natürlich keine Eingaben tätigen können.

    Ich hoffe, daß ich Dir helfen konnte

    Comment


    • #3
      Hallo Alexander!

      Stichwort: inkrementelle Textsuche

      Du solltest Dir mal das Interface JComboBox.KeySelectionManager ansehen, mit dem man auf Tastatureingaben in einer JComboBox reagieren kann. Du bekommst die jeweils gedrückte Taste und das Modell der Box übergeben und lieferst dann einfach den Index des zu selektierenden Eintrags der Box zurück.
      Wenn man sich jetzt alle Eingaben merkt, kann man hieraus den Prefix der Selektion zusammenbauen. Über einen Timer kann man dann noch nach z.B. 1s den gemerkten Puffer wieder löschen, wenn bis dahin keine Eingabe kam.
      Mit dieser Methode simuliert man das Verhalten wie im Explorer, wo man in der Dateianzeige einfach die ersten Buchstaben eines Namens eintippt.

      Gutes Gelingen,
      Ja

      Comment


      • #4
        Hi

        Beispiel dafür ist im Java Buch Graphic Java 2.0
        Swing Beherrschen von David M. Geary aus der Sun reihe beschrieben !

        gruss aus Wie

        Comment


        • #5
          hi Alexander,

          tja, das ist etwas kniffliger. habe diese funktion jetzt auch in einem projekt benoetigt. ich kann dir mal ein ansatz geben. ansatz deshalb, weil ich das caret interface noch nicht nutze, um den vervollstaendigten text farblich zu hinterlegen, auch, weil der
          algorithmus noch etwas bugig ist:-( momentan habe ich zwei textfelder {links fuer die eingabe (tfCityFirst) und rechts fuer die vervollstaendigung (tfCityLast)}. noetig ist also erstmal ein eigener editor fuer die combobox. naja und in diesem steckt dann die logik zum vervollstaendigen {completeText()}. dabei liefert "int Arrays.binarySearch( Array, String )" den index des zuerst im array gefundenen eintrags auf den der String passt. somit braucht man sich um das "pattern matching" schon mal nicht mehr selber kuemmern. desweiteren ist ein keylistener implementiert, der es ueberhaupt erst ermoeglicht, auf einen tastendruck im textfeld zu reagieren und somit prompt eine vervollstaendingung zu haben. "vCity" enthaelt die listeneintraege (diese sollten natuerlich uebereinstimmen, mit den angezeigten im listfeld)! zum abnehmen ("coboCity.getSelectedItem()") des eintrags gilt "tfCityFirst", genauso wie eintraege aus der liste dahin uebernommen werden.
          also, hier der code: (wenn noch dinge unklar sind, einfach nachfragen)<br>
          <pre>
          public class CoboEditor implements ComboBoxEditor {
          JPanel panel;
          JTextField tfCityFirst, tfCityLast;

          class OwnKeyListener extends KeyAdapter {
          Vector vCity;
          StringBuffer sbTmp = new StringBuffer();

          public OwnKeyListener() {
          vCity = new Vector( utils.killRedundance( (Vector)comeFrom.getRS( 0 ).getPool( 5 ) ) );
          /*bzw: vCity.addElement( "Magdeburg" );
          vCity.addElement( "Halle" );
          vCity.addElement( "Berlin" );
          vCity.addElement( "Hannover" );//etc.
          */
          }

          private int search( String sTmp ) {
          return( Arrays.binarySearch( vCity.toArray(), sTmp ) );
          }

          private void completeText() {
          StringBuffer sbLast = new StringBuffer();
          int foundIndex = search( sbTmp.toString() );
          foundIndex = ( foundIndex == 0 ) ? foundIndex += 1 : foundIndex;
          foundIndex = ( foundIndex >= vCity.size() ) ? ( vCity.size() -1 ) : foundIndex;
          int index = foundIndex < 0 ? ( ( foundIndex ) * (-1) ) -1 : foundIndex -1;
          StringBuffer sbAll = new StringBuffer( (String)vCity.elementAt( index ) );
          int i = sbTmp.length();
          while( i < sbAll.length() )
          sbLast.append( sbAll.charAt( i++ ) );
          tfCityLast.setText( sbLast.toString() );
          }
          public void keyPressed( KeyEvent ke ) {
          Object object = ke.getSource();
          int keyCode = ke.getKeyCode();
          if( keyCode == ke.VK_ENTER )
          coboCity.setSelectedItem( tfCityFirst.getText() + tfCityLast.getText() );
          }

          public void keyTyped( KeyEvent ke ) {
          Object object = ke.getSource();
          if( object == tfCityFirst ) {
          if( ( ke.getKeyCode() != ke.VK_BACK_SPACE )
          && ( ke.getKeyCode() != ke.VK_DELETE ) ) {
          sbTmp.append( ke.getKeyChar() );
          completeText();
          }
          }
          }

          public void keyReleased( KeyEvent ke ) {
          Object object = ke.getSource();
          if( ke.getKeyCode() == ke.VK_BACK_SPACE
          && ( ke.getKeyCode() != ke.VK_DELETE ) ) {
          sbTmp.setLength( ( sbTmp.length() > 2 ) ? sbTmp.length() -2 : 0 );
          completeText();
          }
          }//public void keyReleased( KeyEvent k

          Comment


          • #6
            sorry, das eingabefeld reicht nicht soweit:-( - also die fortsetzung:
            <pre>
            ...c void keyReleased( KeyEvent ke )
            }//class OwnKeyListener extends KeyAdapter

            public CoboEditor() {
            OwnKeyListener ownKeyListener = new OwnKeyListener();
            panel = new JPanel();
            panel.setLayout( null );
            panel.setBounds( 0, 0, 190, 20 );
            tfCityFirst = new JTextField();
            tfCityFirst.addKeyListener( ownKeyListener );
            tfCityFirst.setHorizontalAlignment( JTextField.RIGHT );
            tfCityFirst.setBounds( 0, 0, 95, 20 );
            panel.add( tfCityFirst );
            tfCityLast = new JTextField();
            tfCityLast.addKeyListener( ownKeyListener );
            tfCityLast.setBackground( Color.white );
            tfCityLast.setEditable( false );
            tfCityLast.setBounds( 95, 0, 95, 20 );
            panel.add( tfCityLast );
            }

            public void setItem( Object object ) {
            tfCityFirst.setText( object.toString() );
            }

            public Object getItem() {
            return( panel );
            }

            public void selectAll() {
            }

            public void addActionListener( ActionListener al ) {
            }

            public void removeActionListener( ActionListener al ) {
            }

            public Component getEditorComponent() {
            return( panel );
            }
            }
            ...
            coboCity = new javax.swing.JComboBox( utils.killRedundance( (Vector)comeFrom.getRS( 0 ).getPool( 5 ) ) );
            coboCity.setEditable( true );
            coboCity.setBounds( 372, 30, 190, 20 );
            coboCity.setSelectedItem( "" );
            coboCity.setEditor( new CoboEditor() );
            coboCity.addActionListener( panelActionListener );
            jPanel1.add( coboCity );
            </pre>
            gruss<br>
            thomas<br>
            --<br>
            </i>http://www.cs.uni.magdeburg.de/~funke/index.html
            mailto://[email protected]</i&gt

            Comment

            Working...
            X