ComboBox(Model) mit dummyItem

Status
Nicht offen für weitere Antworten.

diggaa1984

Top Contributor
hallo,

ich hatte grad die idee, das wenn ich ne ComboBox nutze, ich gern am Anfang ein DummyItem à la "Bitte wählen" oder sowas hätte, was aber selbst nich im auftauchenden PopUpMenu gewählt werden kann, sprich wenn man da ein Item wählt kann nie wieder dieses Dummy-Element erscheinen (Auswahl also gültig).

bisher hier meine sobene zusammen-gehackte Version mit eigenen ComboBoxModel:

Code:
public class ComboBoxModelDummyItem extends DefaultComboBoxModel {

	//initially selected item
	private Object dummyItem;
	
	public ComboBoxModelDummyItem(Object dummyItem) {
		super();
		this.dummyItem = dummyItem;
		setSelectedItem(dummyItem);
	}
	
	public ComboBoxModelDummyItem(Object[] items, Object dummyItem) {
		super(items);
		this.dummyItem = dummyItem;
		setSelectedItem(dummyItem);
	}

	public ComboBoxModelDummyItem(Vector<?> v, Object dummyItem) {
		super(v);
		this.dummyItem = dummyItem;
		setSelectedItem(dummyItem);
	}
	
}

von den redundanten code-teilen mal abgesehen ... war nur ein Test.
Ich habe nun das ganze so genutzt:

Code:
//attributes ist String-Array mit  gültigen Auswahlmöglichkeiten
ComboBoxModelDummyItem cbm = new ComboBoxModelDummyItem(attributes,"...");
cb = new JComboBox(cbm);
cb.setEditable(false);



so ... funktioniert wunderbar .. ich seh die "..." am Anfang und kann diese auch nie auswählen (bleibt nur stehen wenn ich nix aus dem popup auswähle).

Ich habe das ganze vorher auf normalen Wege probiert mittels:
Code:
//attributes ist String-Array mit  gültigen Auswahlmöglichkeiten
cb = new JComboBox(attributes);
cb.setSelectedItem(new String("..."));
cb.setEditable(false); //sowohl auskommentiert als auch mit dieser Anweisung probiert

leider fruchtet dieser Versuch nicht, nun Frage ich mich warum ^^ .. ich nutze in meinem Hack doch auch diese Methode und da steht drin, wenn das Objekt nicht in der DatenListe ist, aber die ComboBox editierbar, dann wird trotzdem das neue Element ausgewählt .. passiert aber nicht. Und mit meinem Hack von oben kann ich auch das Editable false setzen im Nachhinein - und es klappt.

Weiss wer warum? Gibts eine Möglichkeit ohne das ich diese neue Klasse brauch? Ging zwar schnell und ist ja nicht gross, aber werde das Gefühl nicht los, dass es auch ohne diese geht ^^

Wichtig is eben nur, dass das Dummy-Item nicht im PopUp erscheint

nächtliche Grüße :D
 

Ebenius

Top Contributor
Lies mal die API-Doc, dann wird's klar:
public void setSelectedItem(Object anObject)
Sets the selected item in the combo box display area to the object in the argument. If anObject is in the list, the display area shows anObject selected.

If anObject is not in the list and the combo box is uneditable, it will not change the current selection. For editable combo boxes, the selection will change to anObject.

If this constitutes a change in the selected item, ItemListeners added to the combo box will be notified with one or two ItemEvents. If there is a current selected item, an ItemEvent will be fired and the state change will be ItemEvent.DESELECTED. If anObject is in the list and is not currently selected then an ItemEvent will be fired and the state change will be ItemEvent.SELECTED.

ActionListeners added to the combo box will be notified with an ActionEvent when this method is called.

So geht's:
Code:
cb.getModel().setSelectedItem(new String("..."));

:)
 

diggaa1984

Top Contributor
ja ich habse ja gelesen .. die frage is immer noch warum gehts damit nicht? :D

If anObject is not in the list and the combo box is uneditable, it will not change the current selection. For editable combo boxes, the selection will change to anObject.

das ist der teil, wo ich dachte, das klappt ^^

aber stimmt, JComboBox.setSelectedItem != ComboBoxModel.setSelectedItem .. grad erst aufgefallen
 

Ebenius

Top Contributor
Die ist doch nicht "editable"... In eine "editable" Combo Box kann man tippen. Verstehe ich Dich falsch?

Es geht nicht, weil die Methode in JComboBox so aussieht:
Code:
public void setSelectedItem(Object anObject) {
  Object oldSelection = selectedItemReminder;
  Object objectToSelect = anObject;
  if (oldSelection == null || !oldSelection.equals(anObject)) {

      if (anObject != null && !isEditable()) {
          // For non editable combo boxes, an invalid selection
          // will be rejected.
          boolean found = false;
          for (int i = 0; i < dataModel.getSize(); i++) {
              Object element = dataModel.getElementAt(i);
              if (anObject.equals(element)) {
                  found = true;
                  objectToSelect = element;
                  break;
              }
          }
          if (!found) {
              return;
          }
      }
      
      // Must toggle the state of this flag since this method
      // call may result in ListDataEvents being fired.
      selectingItem = true;
      dataModel.setSelectedItem(objectToSelect);
      selectingItem = false;

      if (selectedItemReminder != dataModel.getSelectedItem()) {
          // in case a users implementation of ComboBoxModel
          // doesn't fire a ListDataEvent when the selection
          // changes.
            selectedItemChanged();
        }
    }
    fireActionEvent();
}

Ebenius
 

Ebenius

Top Contributor
diggaa1984 hat gesagt.:
ich nutze in meinem Hack doch auch diese Methode

Das hab ich vorhin überlesen. Nein. Du nutzt nicht diese Methode. Du benutzt in Deinem Hack DefaultComboBoxModel.setSelectedItem(Object). Damit geht's. In Deinem Negativbeispiel benutzt Du aber JComboBox.setSelectedItem(Object). Damit geht's nicht.

Klar?
 

diggaa1984

Top Contributor
Die ist doch nicht "editable"

aber erst nachdem ich das item setzen wollte. daher wäre jede Angabe gültig, laut dem code und er würde dann dataModel.setSelectedItem(objectToSelect); ausführen, was vermutlich meinem Aufruf in meiner Klasse gleichkommt. o_O

oder hab ich grad tomaten auffe augen .. wie gesagt das setEditable hatte ich ja auch mal auskommentiert .. oder sind die Boxen generell default-notEditable? das würde was erklären ^^

mit den methoden hatte ich oben eben dazu-editiert .. hatte ich auch grad bemerkt ^^

EDIT: finde mittels Eclipse-Call-Hierarchy keine Aufrufe für setEditable ausser mein einen im der Action-Klasse
 

Ebenius

Top Contributor
Da ist noch ein Beitrag von mir... Der erklärt's doch jetzt, oder?

// EDIT: siehe übernächster Post. Um die Wette editiert :)
 

diggaa1984

Top Contributor
im falle das die box standardmäßig editierbar ist, sollte aber der aufruf trotzdem klappen .. oder siehst du das anders? wie gesagt mein setEditable false kommt nachdem ich das item setzen will.

EDIT wegen deinem EDIT: jo, gut dann hat sich meine Vermutung ja eben bestätigt :D ... aber testen wollt ich das grad nicht mehr ^^ .. gut danke dir, bin über deinen kürzeren Weg gegangen, der ja das gleiche macht wie meine tolle klasse ^^
 

Ebenius

Top Contributor
Jetzt verstehe ich Dein Verständnisproblem. Die JComboBox ist nicht editable. Standardmäßig. Klar? Ob Du vor oder nach dem setEditable(false) das setSelectedItem(Object) benutzt hast ist also völlig unwichtig. Es war ja schon false. Teste doch mal mit
Code:
//attributes ist String-Array mit  gültigen Auswahlmöglichkeiten 
cb = new JComboBox(attributes); 
cb.setEditable(true);
cb.setSelectedItem(new String("...")); 
cb.setEditable(false);

Kannst Du Denn in die Combo Box tippen? Ich nicht. Auch nicht, wenn die setEditable()s auskommentiert sind.
 

André Uhres

Top Contributor
Hier ist eine mögliche Lösung mit einem Renderer:
Code:
/*
 * ComboPrompt.java
 * display a prompt message only when no item has been selected in the combo box.
 */
import java.awt.*;
import javax.swing.*;
import javax.swing.plaf.basic.BasicComboBoxRenderer;
public class ComboPrompt extends JFrame {
    private JComboBox comboBox;
    private String prompt = "Select Item";
    public ComboPrompt() {
        super("Combo Prompt");
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setSize(400, 300);
        setLocationRelativeTo(null);
        comboBox = new JComboBox();
        comboBox.setModel(new DefaultComboBoxModel(new String[]{"Item 1", "Item 2", "Item 3", "Item 4"}));
        getContentPane().add(comboBox, BorderLayout.PAGE_START);
        comboBox.setSelectedIndex(-1);
        comboBox.setRenderer(new BasicComboBoxRenderer() {
            @Override
            public Component getListCellRendererComponent(
                    final JList list, final Object value, final int index,
                    final boolean isSelected, final boolean cellHasFocus) {
                super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
                if (value == null) {
                    setText(prompt);
                }
                return this;
            }
        });
    }
    public static void main(final String[] args) {
        Runnable gui = new Runnable() {
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (Exception ex) {
                }
                new ComboPrompt().setVisible(true);
            }
        };
        //GUI must start on EventDispatchThread:
        SwingUtilities.invokeLater(gui);
    }
}
 

diggaa1984

Top Contributor
tatsache auch ne variante :D Wenn man das Verhalten aber mehrmals brauch, kann man das aber bestimmt in Betracht ziehen, aber für meine bisherige einmalige Anwendung greif ich auf die Variante mit dem Model zurück.

danke dir, wieder was gelernt
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Swing Model für ComboBox AWT, Swing, JavaFX & SWT 14
D ComboBox-Model mit Observer AWT, Swing, JavaFX & SWT 3
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
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
N Filternde Combobox in JTable verliert Fokus nach erster Eingabe AWT, Swing, JavaFX & SWT 2
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
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 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