Swing ComboBox: Auswahl eines Items der Liste durch Eingabe eines Buchstabens

gbunge

Aktives Mitglied
Hallo Java-Gurus,
mir gelingt es nicht aus den Items einer editierbaren ComboBox durch die Eingabe eines Buchstabens eine Auswahl zu erhalten, obwohl in den gegoogelten Beiträgen davon immer gesprochen wird, daß das bei der 'swing' -ComboBox automatisch gegeben ist.
Hier mein Code-Fragment:
Java:
.
.
.
String[] combotext = {"Ausgabe", "Einnahme"};
JComboBox  cb = new  JComboBox( combotext );
cb.setPreferredSize( new Dimension( 200, 30 ));
cb.addActionListener( this );
cb.setActionCommand( " 2 " );
cb.setEditable( true );
.
.
.
Meine Absicht ist es, durch die Taste 'E' das zweite Item zu selektieren und auch im Textfeld anzuzeigen.
Was ist noch falsch am Code?

Gruß GBunge
 
Ja wie schon in den Foren und anderen Tutorials richtig gestellt wurde, hat das die Kombobox wirklich standardmäßig implementiert.

Java:
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Test {

  public static void main(String... args) {
    SwingUtilities.invokeLater(new Runnable() {

      @Override
      public void run() {
        new Test();
      }
    });
  }

  public Test() {
    JFrame frame = new JFrame("ComboBox");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(300, 200);
    frame.setLocationByPlatform(true);

    JPanel mainPanel = new JPanel();

    JLabel label = new JLabel();
    JComboBox<String> combo = new JComboBox<>(new String[]{"Ausgabe", "Einnahme"});
    combo.addItemListener(new ItemListener() {

      @Override
      public void itemStateChanged(ItemEvent e) {
        if (e.getStateChange() == ItemEvent.SELECTED) {
          label.setText((String) e.getItem());
        }
      }
    });
    label.setText((String) combo.getSelectedItem());
    mainPanel.add(combo);
    mainPanel.add(label);

    frame.add(mainPanel);
    frame.setVisible(true);
  }
}

Wenn die ComboBox selektiert ist (den Fokus hat), kannst du mit Buchstaben Elemente wählen. Man sollte allerdings nicht zu schnell hintereinander die Tasten drücken.
 
Hallo Flown,
erstmal Dank für die schnelle Reaktion.
Das Nachvollziehen Deines Codes gestaltete sich etwas schwierig.

Ich entwickle mit NetBeans auf einem MAC.
Meine Javaversion ist 'java version "1.6.0_65"'

Die Anweisung:
Code:
JComboBox<String> combo = new JComboBox<>(new String[]{"Ausgabe", "Einnahme"});
wird von NetBeans angemahnt mit:
Code:
type JComboBox does not take parameters
 cannot infer type arguments for JComboBox;
 reason: cannot use '<>' with non-generic class JComboBox
 diamond operator is not supported in -source 1.6 use -souce 7 or higer

Ich habe desswegen Deinen Code leicht geändert in:
Java:
public class ComboT extends JFrame { 
public JLabel label;
public ComboT() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(300, 200);
setLocation(500, 30);
setLocationByPlatform(true);
JPanel mainPanel = new JPanel();
label = new JLabel();
JComboBox combo = new JComboBox();
combo.addItem("");
combo.addItem("Ausgabe");
combo.addItem("Einnahme");
combo.setEditable( true );
combo.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
label.setText((String) e.getItem());
}}});
mainPanel.add(combo);
mainPanel.add(label);
add(mainPanel);
}

public static void main(String[] args) {
JFrame fr = new ComboT();
fr.setVisible(true);
}
}

Ausserdem habe ich noch zwei weitere wichtige Änderungen eingefügt.
1. am Anfang der Items steht ein leeres Item, weil ich explizit wählen will.
2. die ComboBox ist aus dem gleichen Grund editierbar.

Nochmals meine Absicht ( die in c oder c++ funktioniert )
ich möchte durch Eingabe eines 'E' das Item 'Einnahme' selektieren

Das Problem ist aber weiterhin nicht gelöst!

Gruss GBunge
 
Also um meinen Code zum laufen zu bringen löscht du einfach die <String> und <> bei ComboBox und machst das Label final. Dann kompiliert es auch unter 1.6.

Meine nächste Frage ist, warum überhaupt noch 1.6?

Zu deinen Problemen. Da gibt es keine einfachen Lösungen zur automatischen Vervollständigung bei Editable ComboBoxes, aber HIER ist einer, der sich um Autovervollständigung gekümmert hat.

Des Weiteren braucht man kein leeres Element einfügen, man sagt einfach, dass die ComboBox nichts selektieren soll:
Java:
combo.setSelectedIndex(-1);
 

Zurück
Oben