# Aktive Komponenten in JList



## sm (6. Mrz 2006)

Hallo,

ich suche dringend eine Möglichkeit, aktive Komponenten wie JTextfield und JButton in einer JList anzuzeigen und auch zu verwenden.

Die Anzeige ist kein Problem mit einem ListCellRenderer. Aber da ist es eben nur die reine Anzeige.

Welche Möglichkeit(en) gibt es solche Komponenten in einer JList direkt zu verwenden?
Für mich kommt nur eine JList in Frage, da ich das Ganze für die Rechnungsposten einer Rechnungsschreibung verwende.

Danke für die Antworten!


----------



## AlArenal (6. Mrz 2006)

Was soll diese ominöse "aktive Komponente" sein?


----------



## Ralf Ueberfuhr (6. Mrz 2006)

Genau diese Frage habe ich auch schon vor Kurzem in diesem Forum gestellt, aber leider keine Antwort bekommen. Ich denke, ich weiß, was sm will.

Er möchte eine Komponente, z.B. einen JPanel anzeigen, der komplexer ist als ein JLabel. Daten sollen direkt in der Liste geändert werden können, mithilfe von Buttons.

Oder (wie in meinem Fall) die Objekte auf dem Panel sollen auf mögliche Eingaben reagieren, sie sollen fokussierbar sein.

Das Beispiel JListMutable fällt flach.


----------



## sm (6. Mrz 2006)

Hi masseur81,

Du hast den Punkt getroffen.

Ich möchte mittels JTextField und JButton Daten ändern. D.h. die JTextFields die auf einem JPanel liegen, welches in eine JList eingebettet ist, sollen direkt focussierbar sein. 

Wundert mich, dass es zu diesem Thema nicht schon einige Beiträge gibt.

MfG


----------



## AlArenal (6. Mrz 2006)

Ah, okay.. beim x-ten Duchlesen verstehe ich es auch mal - bin noch etwas laggy wegen der Oscar-Nacht..

Das Schöne an der Programmierung ist doch, dass man beinahe alles umgesetzt bekommt, was man sich ausdenken kann - wenn auch mitunter mit etwas mehr Aufwand 



			
				sm hat gesagt.:
			
		

> Für mich kommt nur eine JList in Frage, da ich das Ganze für die Rechnungsposten einer Rechnungsschreibung verwende.



Das halte ich schonmal für Schmarrn. Wieso solltest du denn keine JTable verwenden können, die standardmäßig einen sehr flexiblen Renderer- und Editor-Mechanismus mitbringt?


----------



## Ralf Ueberfuhr (6. Mrz 2006)

Ich habe die letzten Tage unzählige Ansätze versucht:
- JList vererben und repaint()-Methode überschreiben (Panels per add(...) auf die JList setzen)
- JComponent vererben und JList als delegate verwenden
- JPanel vererben und einfach die Komponenten zeichnen

Ich werd mich nochmal an letztere Variante versuchen, werde dann Einschränkungen beim SelectionModel hinnehmen. Ist sowieso ein Problem, denn wie reagiert man auf Pfeiltasten (z.B. JButton vs. JTextArea)?

Ich werde es so implementieren:
- Nur ein JPanel ist selektiert, nämlich der mit dem Focus.
- Per STRG+TAB kann man von Panel zu Panel springen, per STRG+ALT+TAB zum nächsten Element außerhalb der Liste, per TAB wie gewohnt innerhalb des Panels.
- Ein Anteil von JListMutable wird auch vorkommen, also wohl ein Flag, wann die Komponente editierbar ist (Doppelklick, F2, zweifacher Klick wie im Windows Explorer (umbenennen) oder einfach durch Selektion.

Was meinst du dazu?


----------



## sm (6. Mrz 2006)

Also machst Dus ganz ohne JList?

@AlArenal:
Für "Schmarrn" halte ich das nicht.

Ich verwende die Anzeige in einer JList, da ich dieses Schön und Variabel in ein JScrollpane einbetten kann.


----------



## Ralf Ueberfuhr (6. Mrz 2006)

@AlArenal: Ich mag JTable nicht ableiten, da dann die ganzen öffentlichen Methoden bleiben. Es soll nunmal keine Tabelle sein, sondern eben eine Liste.

@sm: Ich werde JPanel ableiten, aber ähnliche Methoden wie JList bereitstellen. Ein paar Methoden könnten entfallen, aber ansonsten muss man nicht großartig Quellcode umändern, um ein Ergebnis zu bekommen.

Mal sehen, ob ich es jetzt endlich hinbekomm.


----------



## AlArenal (6. Mrz 2006)

sm hat gesagt.:
			
		

> @AlArenal:
> Für "Schmarrn" halte ich das nicht.
> 
> Ich verwende die Anzeige in einer JList, da ich dieses Schön und Variabel in ein JScrollpane einbetten kann.



Die Antwort überzeugt mich nicht im geringsten, denn



			
				API hat gesagt.:
			
		

> public void setViewportView(Component view)



Zeig mir mal ein Swing-Widget, dass du nicht in eine JScrollpane stecken kannst.... Da wirste keins finden, denn die sind alle von Component abgeleitet...


----------



## AlArenal (6. Mrz 2006)

masseur81 hat gesagt.:
			
		

> @AlArenal: Ich mag JTable nicht ableiten, da dann die ganzen öffentlichen Methoden bleiben. Es soll nunmal keine Tabelle sein, sondern eben eine Liste.



Wenn man sich aus irgendwelchen Gründen (die ich diesem Fall nicht nachvollziehen kann, weil mir der Sinn von Satz 1 nicht einleuchten mag) gegen eine einfache Lösung wehrt, hat vielleicht nur die schwere Lösung verdient


----------



## sm (6. Mrz 2006)

Natürlich kannst Du alle Swing-Komponenten in ein JScrollpane packen. Völlig richtig.

ABER: Schon mal probiert, das mit JPanels zu machen. Funktioniert nicht richtig.
Bei einer JList springt die Scrollbar je nach Selektierung automatisch weiter. Dies funktioniert bei anderen Swing-Klassen, wie JPanel, nicht. Da mit Positionsangaben zu hantieren ist recht umständlich meiner Meinung nach.

Deswegen JList.

Es wäre schön, wenn Du auf meine Frage antworten würdest, ob es eine Möglichkeit gibt, solch eine JList zu bauen, oder nicht.


----------



## Beni (6. Mrz 2006)

Da das ListModel keine Methode besitzt, einen Wert einzutragen, und die Swing-Komponenten streng nach MV(C) arbeiten, ausserdem die JList keine Methoden bietet einen Editor zu setzen; würde ich sagen: das geht so nicht.

3 Lösungsmöglichkeiten fallen mir ein:

1. Ein JTable mit nur einer Spalte verwenden. Da kann man den TableCellEditor benutzen um etwas zu verändern.

2. Anstelle einer JList ein JPanel verwenden, und mehrere Buttons Textfelder draufkleben. Das funktioniert aber nur bei einer begrenzten Anzahl Elemente, so ab 1000 Einträge wird das doch ziemlich hässlich.

3. Selbst eine Pseudo-JList implementieren, die sowas unterstützt.


----------



## AlArenal (6. Mrz 2006)

masseur81 hat gesagt.:
			
		

> @AlArenal: Ich mag JTable nicht ableiten, da dann die ganzen öffentlichen Methoden bleiben. Es soll nunmal keine Tabelle sein, sondern eben eine Liste.



Ne Liste ist auch bloß ne Tabelle mit lediglich einer Spalte.. 

Was die öffentlichen Methoden angeht, gibts da nen ganz simplen Workaround: Eigene öffentliche Komponenten leitet man von JComponent oder JPanel ab. Darauf klatscht man einfach die eigentliche Komponente. So ist man beim Design des funktionellen Interfaces der öffentlichen Komponenten deutlich unabhängiger in Benennung, Sichtbarkeit, etc.
Ich hab ne ganze Reihe mehr oder minder aufwändiger UI-Komponenten, die ich in mehreren unserer Anwendungen verwende und von daher entsprechend gekapselt habe und hier auch im UI-Designer verwenden kann.


----------



## Ralf Ueberfuhr (6. Mrz 2006)

Und was ist, wenn man ein Explorer-Fenster implementieren will, also mit layoutOrientation=JList.HORIZONTAL_WRAP?

;-)


----------



## sm (6. Mrz 2006)

Also gibts wohl keine Möglichkeit das so zu implementieren wie ich es geplant hatte?


----------



## AlArenal (6. Mrz 2006)

Dann strick ich mir selbst was und weiß, dass Layout-Manager meine Freunde sind.. 

Erinnert mich an die Druckvorschau, die ich letztens gemacht habe...


----------



## Roar (6. Mrz 2006)

suchst du sowas: http://jroller.com/page/santhosh/20050607#making_jlist_editable_no_jtable ?


----------



## AlArenal (6. Mrz 2006)

Also wenn Kumar als allererstes sagt "But I hate this approach.", sollte man es lassen. Der Gute ist ein recht bekannter und eifriger Swing-Detailtüfteler...


----------



## Ralf Ueberfuhr (6. Mrz 2006)

Wenn du auf ein SelectionModel wie in JList verzichten kannst (nur SelectionListener und setSelectedIndex/Value), dann kann ich heut abend vielleicht einen Vorschlag anbieten.


----------



## sm (6. Mrz 2006)

Du solltest vielleicht etwas genauer lesen:

But i hate this approach bezieht sich auf :

"If you search for "JList editable" in google, you will find many pages. But all of them use the following approach:
    JTable with one column without JTableHeader = Editable JList"


----------



## AlArenal (6. Mrz 2006)

Oh Schreck!

Nun werde ich Kumars Weblog direkt aus meiner Liste streichen.. Muss ich eben mit Romain und Slobodan auskommen..


----------



## Ralf Ueberfuhr (6. Mrz 2006)

masseur81 hat gesagt.:
			
		

> Das Beispiel JListMutable fällt flach.



Wie ich schon sagte, Kumar ist nix. Ich habe diese editierbare Liste auch schon verwendet, nach ein paar Anpassungen. Mit deren Hilfe reagieren die Komponenten auch nicht auch Ereignisse.


----------



## sm (6. Mrz 2006)

Ja habe es grade durchgeschaut.
Das ist es nicht.

Jetzt mal ne andere Frage: Wenn ich JTable verwenden würde, arbeitet diese doch ungefähr wie Kumars JList-Version, oder?

Das ist aber garnicht der Punkt. Ich will ja nichts in der JList selber verändert. Sondern in dem Objekt, das ich zur JList hinzugefügt habe...

Bitte um Hilfe!

MfG


----------



## AlArenal (6. Mrz 2006)

sm hat gesagt.:
			
		

> Das ist aber garnicht der Punkt. Ich will ja nichts in der JList selber verändert. Sondern in dem Objekt, das ich zur JList hinzugefügt habe...



Heißt das, du brauchst gar keine JList, sondern nur ne Möglichkeit eine Anzahl n beliebiger Komponenten untereinander in einer Scroll-Pane darzustellen? => JPanel, LayoutManager


----------



## sm (6. Mrz 2006)

AlArenal hat gesagt.:
			
		

> Heißt das, du brauchst gar keine JList, sondern nur ne Möglichkeit eine Anzahl n beliebiger Komponenten untereinander in einer Scroll-Pane darzustellen? => JPanel, LayoutManager



Nein nicht ganz richtig. Ich will die JList verwenden, da der Model-Teil von JList gut ist. 
Ich habe das Ganze schon mal auf ein Panel gebaut. Da sich aber bei Rechnungen die Anzahl der Posten laufend ändert, d.h. es kommen welche hinzu oder werden gelöscht, kann man hier die Funktionalitäten von JList (add(), remove()) usw. verwenden.
Nimmt man hierfür beispielsweise ein JPanel her, auf dem man wiederum JPanels legt ist das weitaus umständlicher (habe ich bereits gemacht), muss immer wieder neu gezeichnet werden usw.
JList führt solche Grundfunktionen bereits automatisch aus.

Was ich brauche, ist:

Meine Panels, auf denen Buttons und Textfelder liegen, in einer JList. 
Wenn sie drin sind, will ich auf die Buttons und Textfelder zugreifen können.

MfG


----------



## sm (6. Mrz 2006)

Noch eine Frage:

Wenn ich einen JButton in einer JTable anzeigen lasse, kann ich ihn denn dann verwenden. Ich denke, auch JTable (wie JList) ist eine Anzeigekomponente?!


----------



## AlArenal (6. Mrz 2006)

So langsam dämmerts mir... Aber da würde ich den Krims selber schreiben und gut iss. Ich persönlich halte es für aufwändiger, unflexibler und fehleranfälliger JList zu vergewaltigen, als sich das eben selbst zu schreiben. 

JTable unterstützt die Integration von Controllern in Form eines TableCellEditors.


----------



## sm (6. Mrz 2006)

AlArenal hat gesagt.:
			
		

> So langsam dämmerts mir... Aber da würde ich den Krims selber schreiben und gut iss. Ich persönlich halte es für aufwändiger, unflexibler und fehleranfälliger JList zu vergewaltigen, als sich das eben selbst zu schreiben.



Wie gesagt, das habe ich ja schon gemacht. Momentag liegen JPanels auf einem großen JPanel. Dieses ist in ein JScrollpane eingebettet. Jedesmal wenn nun ein Posten gelöscht wird oder dazu kommt, wird das Panel neu gezeichnet und neu im Scrollpane angezeigt. 
Des ist alles sehr unflexibel und vor allem intern sehr unübersichtlich.

Ich bin jetzt am überlegen ob ich die Panels nicht einfach anzeigen lasse und mit Doppelklick oder ENTER editiere. Es war einfach so gedacht, dass ich direkt, ohne einen Befehl zu geben (z.B. ENTER), auf die JTextFields oder Buttons zugreifen kann.

Kannst Du mir folgen?


----------



## AlArenal (6. Mrz 2006)

So ein paar Screenshots würden die Sache erhellen...

Für umfangreichere Sachen ist der Ansatz natürlich Overkill, weil man Unmengen an Instanzen von Swing-Widgets erzeugt. Am sinnigsten wäre es womöglich sich ein eigenes Model für die Rechnungsdaten zu schreiben und dafür einen View, der analog zu JList oder JTree oder JTable.
Mausklicks, etc würde ich durchreichen.... Evtl. könnte man auch gleich die Interfaces TableCellRenderer und TableCellEditor verwenden. Für die Umsetzung des Editors würde ich mal schauen, wie die das in JTablegemacht haben.


----------



## sm (6. Mrz 2006)

AlArenal hat gesagt.:
			
		

> So ein paar Screenshots würden die Sache erhellen...
> 
> Für umfangreichere Sachen ist der Ansatz natürlich Overkill, weil man Unmengen an Instanzen von Swing-Widgets erzeugt. Am sinnigsten wäre es womöglich sich ein eigenes Model für die Rechnungsdaten zu schreiben und dafür einen View, der analog zu JList oder JTree oder JTable.
> Mausklicks, etc würde ich durchreichen.... Evtl. könnte man auch gleich die Interfaces TableCellRenderer und TableCellEditor verwenden. Für die Umsetzung des Editors würde ich mal schauen, wie die das in JTablegemacht haben.



Natürlich sind die Posten in einem eigenen Model gespeichert. Das Panel dient nur der Anzeige. Und die JList soll diese Anzeige gliedern...
Das würde ich dann gerne mit einem ListCellRenderer machen.


----------



## sm (7. Mrz 2006)

Morgen AlArenal.

Hast Du oder auch jemand anders noch Vorschläge, wie ich das am besten umsetze?

Noch eine Frage: Ich hab jetzt in JavaDoc von JList was von AccessibleJList gelesen. Allerdings verstehe ich nicht ganz wie das aufgebaut ist und was das genau zu bedeuten hat....könnt ihr mir helfen?


----------



## AlArenal (7. Mrz 2006)

Die Java Accessibility API bietet Funktionalitäten um Menschen mit Behinderungen Programme bedienen zu lassen. Das dürfte ne andere Baustelle sein.

Was dein eigentliches Problem angeht, weiß ich nciht was ich da noch sagen soll. Letzten Endes musst du wissen was du wirklich brauchst und entschieden, wie du es umsetzt. Ich weiß ja nicht was da die konkreten Anforderungen bei euch sind.

Ich persönlich würde, wie gesagt, mir ne komplett eigene Komponente schreiben, bzw. mehrere, so dass ich nach außen mit einer ganz einfachen API Einträge hinzufügen/enfernen kann, ... Sprich, eigene JComponent/eigenes JPanel, Scrollable Interface zum zeilenweise scrollen, evtl. eigene Rnederer- und Editor-Komponente, ...


----------



## Ralf Ueberfuhr (7. Mrz 2006)

Also Leute, seht mal hier, ich habe eben selbst ne Hilfskomponente geschrieben und biete sie hier zum Testen an.


----------



## AlArenal (7. Mrz 2006)

"Could not find main class."


----------



## Ralf Ueberfuhr (7. Mrz 2006)

Das Manifest ist aber drin und korrekt, bei mir läuft es.


----------

