Filternde Combobox in JTable verliert Fokus nach erster Eingabe

nieselfriem

Bekanntes Mitglied
Hallo!

Ich habe unten stehende JComboBox Implementierung in eine Tabellenzelle eingefügt. Klappt auch so weit ganz gut. Leier verliert schon bei der ersten Eingabe die Zelle den Fokus, so dass mein die Eingabe nicht fortsetzen kann. So wird immer nur der erste Eintrag ausgewählt. Wenn z.B. Die Einträge Maler und Maurer in der Liste sind, so wird bei der Eingabe des Buchstabens M sofort der Maler ausgewählt und nicht die Eingabe bis zum dritten Buchstaben abgewartet. Wie kann ich es bewerkstelligen, dass der Fokus auch nach der ersten und weiteren Eingabe eines Buchstabens erhalten bleibt.
Java:
package guitests;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

/**
 * Eine editierbare Combobox, die den nächsten wahrscheinlichen
 * Eintrag vorschlägt. 
 * @author  Aljoscha Rittner
 * @version 1.0 (immer noch ;-)
 */
public class JSelComboBox extends JComboBox implements KeyListener {

  // Nur Einträge der Liste editierbar
  boolean inputListItemsOnly = true;
  boolean caseSensitive      = false;

  public JSelComboBox () {
    super();
    setEditable(true);
    getEditor().getEditorComponent().addKeyListener(this);
  }

  public JSelComboBox (Object[] items) {
    super(items);
    setEditable(true);
    getEditor().getEditorComponent().addKeyListener(this);
  }

  /**
   * Setzt das Verhalten für Eingaben, die nicht den Listeneinträgen
   * entsprechen.
   * @param bOnly true: nur Listeinträge; false: alle Eingaben
   *              erlauben.
   */
  public void setInputListItemsOnly (boolean bOnly) {
    inputListItemsOnly = bOnly;
  }

  /**
   * Gibt das Verhalten für Eingaben, die nicht den Listeneinträgen
   * entsprechen zurück.
   * @return true: nur Listeinträge; false: alle Eingaben erlauben
   */
  public boolean isInputListItemsOnly () {
    return inputListItemsOnly;
  }

  /**
   * Setzt das Verhalten für die Suche der Listeneinträge.
   * @param bCaseSensitive true: Groß/Kleinschreibung ist notwendig
   */
  public void setCaseSensitive (boolean bCaseSensitive) {
    caseSensitive = bCaseSensitive;
  }

  /**
   * Gibt das Verhalten für die Suche der Listeneinträge zurück.
   * @param bCaseSensitive true: Groß/Kleinschreibung ist notwendig
   */
  public boolean isCaseSensitive () {
    return caseSensitive;
  }

  public void keyReleased(final java.awt.event.KeyEvent p1) {
       if (! isPopupVisible() ) {
      setPopupVisible(true);
    }
  }

  public void keyPressed(final java.awt.event.KeyEvent p1) {
    if (! isPopupVisible() ) {
      setPopupVisible(true);
    }
    if (p1.getKeyCode() == p1.VK_DELETE) {
      JTextField jtf = (JTextField) getEditor().getEditorComponent();
      resetInput();
      p1.consume();
    }
  }

  public void keyTyped(final java.awt.event.KeyEvent p1) {
    int nPos = -1;
    String search = null;

    JTextField jtf = (JTextField) getEditor().getEditorComponent();

    nPos = jtf.getSelectionStart();
    if ( nPos != -1 ) {
      if ( p1.getKeyChar() == p1.VK_BACK_SPACE ) {
        search = jtf.getText()
          .substring(0, nPos == 0 ? nPos : nPos-1);
        if ( search.equals("") ) {
          resetInput();
          p1.consume();
          return;
        }
      } else {
        search = jtf.getText().substring(0, nPos);
        search = search + p1.getKeyChar();
      }

      findAndSel (search, p1);
    } else {
      setSelectedIndex(-1);
    }
  }

  /**
   * Sucht einen Eintrag anhand einer Zeichenkette und wählt evtl.
   * eine Zeile aus.
   * Wenn nur Listeneinträge ausgewählt werden dürfen und die
   * Zeichenkette nicht gefunden wurde, dann wird die Eingabe
   * verhindert.
   * @param search Zeichenkette für die Suche
   * @param p1     Event des Tastendruckes
   */
  protected void findAndSel (String search,
                             java.awt.event.KeyEvent p1) {
    JTextField jtf = (JTextField) getEditor().getEditorComponent();
    int start = getSelectedIndex() + 1;
    int index = findString (search, start);

    if ( index == -1 )
      index = findString (search, start-1);

    if ( index == -1 )
      index = findString (search, 0);

    if ( index != -1 ) {
      System.out.println(index);
      String found = getModel().getElementAt(index).toString();
      setSelectedIndex(index);
      jtf.setText(found);
      jtf.setCaretPosition (search.length());
      jtf.setSelectionEnd (found.length());
      jtf.setSelectionStart (search.length());
      p1.consume();
    } else {
      if ( isInputListItemsOnly () ) {
        getToolkit().beep();
        p1.consume();
      }
    }
  }

  /**
   * Sucht einen Eintrag anhand einer Zeichenkette und gibt die Zeile
   * zurück.
   */
  protected int findString (String search, int start) {
    ComboBoxModel cbm = getModel();
    if ( start < 0 ) start = 0;
    for ( int i = start; i < cbm.getSize(); i++ ) {
      if (isCaseSensitive()) {
        if ( cbm.getElementAt(i).toString().startsWith(search) ) {
          return i;
        }
      } else {
        if ( cbm.getElementAt(i).toString().toLowerCase()
             .startsWith(search.toLowerCase()) ) {
          return i;
        }
      }
    }
    return -1;
  }

  /**
   * Setzt die Eingaben und die Auswahlzeile zurück.
   */
  protected void resetInput() {
    JTextField jtf = (JTextField) getEditor().getEditorComponent();
    if ( isInputListItemsOnly () == false ) {
      jtf.setText("");
      jtf.setCaretPosition(0);
      setSelectedIndex(-1);
    } else {
      jtf.setText (getModel().getElementAt(0).toString());
      setSelectedIndex(0);
      jtf.setSelectionEnd(jtf.getText().length());
      jtf.setSelectionStart(0);
    }
  }
}
erstellen der Combobox
Java:
 public JSelComboBox berufBerufDrop() {
        Vector berufe = new Vector();
        berufe.add("Eletriker");
        berufe.add("Fließenleger");
        berufe.add("Koch");
        berufe.add("Maler");
        berufe.add("Maurer");
        berufe.add("Tischler");
        JSelComboBox berBeruf = new JSelComboBox();
        DefaultComboBoxModel model = new DefaultComboBoxModel(berufe);
        berBeruf.setModel(model);
        berBeruf.setMaximumRowCount(4);
        return berBeruf;
    }
Einfügen in die Tabelle
Java:
        jBerufeTBL.getColumnModel().getColumn(0).setCellEditor(new DefaultCellEditor(tblComponents.berufBerufDrop()));

Gruß niesel
 

Michael...

Top Contributor
Wenn z.B. Die Einträge Maler und Maurer in der Liste sind, so wird bei der Eingabe des Buchstabens M sofort der Maler ausgewählt und nicht die Eingabe bis zum dritten Buchstaben abgewartet. Wie kann ich es bewerkstelligen, dass der Fokus auch nach der ersten und weiteren Eingabe eines Buchstabens erhalten bleibt.
In dem Du nicht setSelectedIndex(...) aufrufst ;-)

Keine Ahnung, ob es dafür eine einfach Lösung gibt. Standardmäßig kann man durch Drücken eines Buchstabens durch die Einträge navigieren, die mit diesem Buchstaben anfangen. Eventuell kann man sich da im Quellcode was abschauen. Vielleicht ist es sogar einfacher sich sowas selbst zu bauen mittels JTextField und einer JList in einem JPopupMenu
 

nieselfriem

Bekanntes Mitglied
Wenn ich aber diese Klasse in einer JComboBox aufrufe die nicht in einer Tabellenzelle integriert ist, kann ich die Eingaben fortsetzen.
Gibt es da einen Kniff?

Gruß niesel
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Element aus comboBox mit observableList löschen AWT, Swing, JavaFX & SWT 3
T Combobox mit Autocomplete-Funktion AWT, Swing, JavaFX & SWT 7
J Eingaben aus Textfield & ComboBox speichern und in ComboBox wieder ausgeben AWT, Swing, JavaFX & SWT 3
N Promt Text der Combobox AWT, Swing, JavaFX & SWT 0
Doppel JavaFX ComboBox AWT, Swing, JavaFX & SWT 5
P JavaFX ClassCastException bei ComboBox.getValue AWT, Swing, JavaFX & SWT 4
F Wie bekomme ich den Wert der ComboBox in eine Variable gespeichert welche ich für meinen ActionListener nutzen kann? AWT, Swing, JavaFX & SWT 3
M Swing Java Swing/AWT Combobox Bug AWT, Swing, JavaFX & SWT 3
M Combobox bild anklicken AWT, Swing, JavaFX & SWT 2
L JavaFX Wiederspenstige ComboBox AWT, Swing, JavaFX & SWT 0
P Combobox und Enum AWT, Swing, JavaFX & SWT 3
L ComboBox Wert automatisch auswählen AWT, Swing, JavaFX & SWT 6
L Methode zum Füllen einer ComboBox AWT, Swing, JavaFX & SWT 4
K Nullpointer Combobox Listener AWT, Swing, JavaFX & SWT 2
K JavaFX Combobox, Textfield & setOnMouseClicked AWT, Swing, JavaFX & SWT 2
it_is_all Swing Button, ComboBox,... -- Unterschied: NetBeans Design <-> Ausführung AWT, Swing, JavaFX & SWT 2
D JavaFX ComboBox String setzen AWT, Swing, JavaFX & SWT 20
offi Combobox in TableCell AWT, Swing, JavaFX & SWT 1
D Javafx Combobox Abfrage aus mysql AWT, Swing, JavaFX & SWT 8
K Event Handling ComboBox Event Handler AWT, Swing, JavaFX & SWT 7
MrSnake ComboBox-Einträge werden unsichtbar AWT, Swing, JavaFX & SWT 0
L ComboBox: slider positionieren AWT, Swing, JavaFX & SWT 0
M JavaFX ComboBox: Update zur Laufzeit AWT, Swing, JavaFX & SWT 16
M JavaFX Combobox bindBidirectional AWT, Swing, JavaFX & SWT 4
D [Anfänger]ComboBox erstellt Einträge in einer anderen ComboBox AWT, Swing, JavaFX & SWT 3
T JavaFX Editable Combobox Text-Selektierung nach Trigger AWT, Swing, JavaFX & SWT 4
H Combobox aktualisieren AWT, Swing, JavaFX & SWT 2
G Swing ComboBox: Auswahl eines Items der Liste durch Eingabe eines Buchstabens AWT, Swing, JavaFX & SWT 3
M JavaFX ComboBox AWT, Swing, JavaFX & SWT 5
T Problem: ComboBox und addItem AWT, Swing, JavaFX & SWT 5
J ComboBox als Filter benutzen AWT, Swing, JavaFX & SWT 1
M ausgewählte Inhalt von ListItem inn ComboBox in der Tabelle speichern AWT, Swing, JavaFX & SWT 0
Developer_X Java JTable - Combobox + Checkbox - Cellrenderer + Editor AWT, Swing, JavaFX & SWT 3
G Dynamische ComboBox AWT, Swing, JavaFX & SWT 3
U Combobox mit individuellen Texten AWT, Swing, JavaFX & SWT 5
M JavaFX Combobox - Item Auswahl mit Tasten AWT, Swing, JavaFX & SWT 8
F JavaFX Daten aus Tabelle in ComboBox AWT, Swing, JavaFX & SWT 9
C Beschriftungen von Tabellenspalten mit Combobox aussuchen AWT, Swing, JavaFX & SWT 2
G JavaFX ComboBox .getItems().add() Problem AWT, Swing, JavaFX & SWT 9
D Swing [Frage] ComboBox + Label AWT, Swing, JavaFX & SWT 3
F SWT Problem mit Tabelle und Combobox in einem Wizard AWT, Swing, JavaFX & SWT 5
B JAVAFX icon in ComboBox einfügen AWT, Swing, JavaFX & SWT 5
W Swing Combobox Abhängigkeit AWT, Swing, JavaFX & SWT 1
S ComboBox-Werte aus einem Array an Textfields übergeben AWT, Swing, JavaFX & SWT 3
A Swing GUI mit ComboBox, wenn Item ausgewählt wurde neues GUI AWT, Swing, JavaFX & SWT 7
S Combobox aktualisieren AWT, Swing, JavaFX & SWT 3
B Erstellen eigener Combobox ("CellFactory") AWT, Swing, JavaFX & SWT 4
C Swing ComboBox - ActionListener deaktivieren AWT, Swing, JavaFX & SWT 2
A combobox automatisch in ein textfeld wechseln AWT, Swing, JavaFX & SWT 3
J Swing Drive-ComboBox AWT, Swing, JavaFX & SWT 7
C TextFeld in Verbindung zur ComboBox automatisch aktualisieren AWT, Swing, JavaFX & SWT 7
L Swing Model für ComboBox AWT, Swing, JavaFX & SWT 14
H Combobox in einer einzelnen Zelle der Jtable AWT, Swing, JavaFX & SWT 2
T Java Combobox Problem AWT, Swing, JavaFX & SWT 3
C SWT Combobox mit Textdatei füllen AWT, Swing, JavaFX & SWT 2
M comboBox Listener? AWT, Swing, JavaFX & SWT 2
R Datenbanktabellen in Combobox AWT, Swing, JavaFX & SWT 3
C Combobox bei Tabellenänderung mit aktualisieren AWT, Swing, JavaFX & SWT 11
1 CellEditor mit ComboBox richtig beenden AWT, Swing, JavaFX & SWT 4
L SWT Actionlistener Combobox öffnen AWT, Swing, JavaFX & SWT 4
E Swing CellEditor mit Combobox durch Tastatureingabe editieren?! AWT, Swing, JavaFX & SWT 3
GianaSisters Swing ComboBox im jTable (in bestimmter Zelle nicht über die ganze Spalte) AWT, Swing, JavaFX & SWT 4
T Daten mittels ComboBox in ein JTable adden AWT, Swing, JavaFX & SWT 7
F Wert zu Eintrag in ComboBox speichern?! AWT, Swing, JavaFX & SWT 7
P Swing ComboBox(en) in JTable auslesen und ausgeben AWT, Swing, JavaFX & SWT 11
M Index von Combobox AWT, Swing, JavaFX & SWT 20
L ComboBox in Action AWT, Swing, JavaFX & SWT 4
D ComboBox & CellListRenderer AWT, Swing, JavaFX & SWT 6
D ComboBox-Model mit Observer AWT, Swing, JavaFX & SWT 3
B Taschenrechner mit ComboBox AWT, Swing, JavaFX & SWT 7
T ComboBox auslesen AWT, Swing, JavaFX & SWT 11
P Combobox liesst falschen Wert AWT, Swing, JavaFX & SWT 10
C Combobox im JFrame aus Datenbank befüllen AWT, Swing, JavaFX & SWT 6
M Combobox soll Farbe einer Komponente setzen AWT, Swing, JavaFX & SWT 2
M Swing ComboBox ein SelectedItem übergeben/anzeigen AWT, Swing, JavaFX & SWT 7
J Werte aus Combobox speichern AWT, Swing, JavaFX & SWT 3
J Combobox als Filterkriterium (Gruppierung) in JTable AWT, Swing, JavaFX & SWT 7
R Swing ComboBox und doppelter Event!? AWT, Swing, JavaFX & SWT 10
M SWT Wie Textfeld hinzufügen, nach Auswahl von einem bestimmten Combobox-item? AWT, Swing, JavaFX & SWT 3
M SWT ComboBox mit DB-Inhalten Designfrage AWT, Swing, JavaFX & SWT 5
W MouseListener im editable ComboBox AWT, Swing, JavaFX & SWT 14
W Combobox mit eingabefeld AWT, Swing, JavaFX & SWT 7
T Editable ComboBox / kein Weiterspringen AWT, Swing, JavaFX & SWT 12
M Combobox in JTable AWT, Swing, JavaFX & SWT 4
S Swing ComboBox aus Array befüllen AWT, Swing, JavaFX & SWT 2
K Per ComboBox Dateien einlesen AWT, Swing, JavaFX & SWT 23
0 Hintergundfarbe von editierbarer ComboBox ändern AWT, Swing, JavaFX & SWT 2
M Frage zu ComboBox AWT, Swing, JavaFX & SWT 7
O Bitte um Hilfe bei ComboBox in TableHeader AWT, Swing, JavaFX & SWT 9
A NetBeans und ComboBox AWT, Swing, JavaFX & SWT 2
SuperSeppel13 Combobox zur Farbwahl kollidiert mit NimbusLookAndFeel AWT, Swing, JavaFX & SWT 7
D ComboBox(Model) mit dummyItem AWT, Swing, JavaFX & SWT 10
D Inhalt von Textfield nach ComboBox AWT, Swing, JavaFX & SWT 2
GilbertGrape nochmal editierbare Combobox AWT, Swing, JavaFX & SWT 3
GilbertGrape JTable mit Combobox-Editierung schon nach einem Klick AWT, Swing, JavaFX & SWT 7
E Swing Button ActionListener Infos aus Textfield und ComboBox AWT, Swing, JavaFX & SWT 3
G ComboBox wird nicht angezeigt beim anhängen an eine Gruppe AWT, Swing, JavaFX & SWT 2
G Combobox Event AWT, Swing, JavaFX & SWT 4
G ComboBox aktualisieren AWT, Swing, JavaFX & SWT 13
C Binding eines EntityBean als SelectionInList in ComboBox AWT, Swing, JavaFX & SWT 7

Ähnliche Java Themen

Neue Themen


Oben