PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Höhe einer selbstgeschriebenen JComponent bestimmen



mwanaheri
24-03-2006, 10:38
Ich versuche mich gerade daran, eine Komponente selbst zu schreiben. Sie soll wie eine ComboBox funktionieren, nur dass man im Textfeld tippen kann und die Liste entsprechend gefiltert wird. (Wenn jemand so eine Komponente kennt, bin ich für jeden Hinweis dankbar ;-))
Mein Problem ist nun erst mal die korrekte Größenangabe. Ich hätte gern eine Dimensionierung, wie sie bei der JComboBox üblich ist, mit automatischer Anpassung natürlich. Weiß jemand, wie ich die Größenvorgaben von Komponenten ermitteln kann?

bischi
24-03-2006, 17:17
Ich würd an deiner Stelle ein JTextField nehmen (für die Eingaben) und darunter die JComboBox. Ich glaub, du könntest sogar direkt in der JComboBox Eingaben machen. Abfangen musst dus dann mit nem Action-Listener. Oder hab ich was falsch verstanden?

MfG Bischi

mwanaheri
24-03-2006, 17:54
Ja, man kann eine Combobox "editierbar" machen, also das Textfeld schreibbar. Mir geht es aber um folgendes: Es gibt eine Liste, aus der ausgewählt werden soll. Diese Liste wird aber etwas lang, so dass das Suchen umständlich wird. Also sollen die Eingaben im Textfeld beobachtet werden und die Liste entsprechend dem eingetippten gefiltert werden, so dass nur die Einträge in der Liste angezeigt werden, die mit dem eingetippten (beginsWith) übereinstimmen. Ein soll kein Eintrag neu angelegt werden können und auch nichts eingegeben werden können, was nicht in der ursprungsliste vorhanden ist.

bischi
24-03-2006, 18:27
Wo willst du eingeben können: In der Combobox direkt oder extern?

MfG Bischi

mwanaheri
27-03-2006, 11:13
Hey Bischi, ich hab mal das gewünschte Verhalten simuliert, im angehängten Bild von links nach rechts zu sehen.

Ich würde die Komponente sehr gerne von JComboBox ableiten, nur kriege ich da keinen KeyListener angebracht.

bischi
27-03-2006, 11:40
Könntest du nicht einfach das oberste Element leer lassen und editable machen? Danach einen Action-Listener drauf, bei Aktion jeweils auslesen und die nicht passenden Elemente entfernen?

MfG Bischi

mwanaheri
28-03-2006, 18:28
Na ja, einerseits will ich ja, dass schon das Tippen die Aktion auslöst und nicht erst <enter>, andererseits soll sich die Combobox um das Filtern kümmern, nicht das umliegende Programm. Außerdem muss es ja möglich sein, die Auswahl wieder zu erweitern.
Ich habe das Problem heute gelöst. Es gelang mir endlich, einen KeyListener anzubringen. Das geht bei JComboBox.getEditor().getEditorComponent(). So konnte ich das Ganze doch noch von JComboBox ableiten. Da habe ich inzwischen viel Code für die Tonne geschrieben <grumpf>.
Ich habs mal samt Demo in ein Zip gepackt und angehängt, falls es dich interessiert. Ist nicht ausgefuchst, funktioniert aber.

Danke für die Tips

bischi
28-03-2006, 19:16
Sieht nett aus - vor allem ist der Code recht kurz. Auch das Gimmick mit dem rot hintermalen find ich hübsch.

Mir fehlen ein bisschen die Kommentare - allerdings ist der Code sonst wirklich übersichtlich gehalten.

MfG Bischi

Boron
29-03-2006, 11:09
Ist in der jar-Datei nicht schon der kompilierte Code drin?
Kann man das irgendwie "starten" (Meine Java-Kenntnisse sind nicht mehr so doll)?

Mit "java filterdemo.jar" kommt eine "Exception in thread "main" java.lang.NoClassDefFoundError: filterdemo/jar" in der Konsole.

bischi
29-03-2006, 12:17
Bei mir reicht ein doppelklich auf das Jar-file...


javaw.exe -jar Filename.jar sollte es sonst auch tun.

MfG Bischi

Boron
29-03-2006, 12:47
Mist, Firmenrechner, da war noch Java 1.4 drauf. Flux die Version 5 installiert und schon klappts :).
Vor allem sehr praktisch.

mwanaheri
29-03-2006, 15:02
Ich muss mal schnell eine Warnung loswerden: gerade habe ich festgestellt, dass die Komponente noch Probleme macht, wenn man einen Action-Listener bei ihr registriert. Da muss ich wohl noch nacharbeiten.

Das Datumsfeld, das die Gültigkeit des Datums prüft (vor x, nach x, ...) und wahlweise ein GregorianCalendar oder ein java.sql.Date ausspuckt, muss also noch warten...