ArrayList<int[]> - Problem mit JList!

  • Themenstarter Themenstarter Mujahiddin
  • Beginndatum Beginndatum
M

Mujahiddin

Gast
Einen wunderschönen guten Tag!

Also, nach etlichen Suchanfragen in Google bin ich schon relativ weiter gekommen in meinem Projekt.
Doch jetzt bin ich an ein Problem gestoßen, an dem es scheinbar kein Weiterkommen gibt.
Mein Ziel ist es, dass ich mehrere Einträge, die markiert worden sind, lösche.
Da bin ich schon relativ weit, nur bei einem Problem komme ich nicht mehr weiter.
Wenn mehrere Einträge markiert wurden und der schließlich wird 'ENTF' gedrückt, wird eine ArrayList<int[]> erstellt.
Diese ArrayList nimmt nun alle markierte Indices per
Code:
ArrayList<int[]> indices = new ArrayList<int[]>();
indices.add(jlist.getSelectedIndices());
Das Problem ist: Er nimmt einen ArrayList-Block, und packt alle drei Indices da rein. Wenn ich jetzt den ersten Index löschen will, das heißt
Code:
indices.remove(0);
eingebe, dann löscht er den ganzen Block. Unter dem Befehl
Code:
indices.remove(0|0);
versteht er auch nichts. Ich gebe euch mal einen Screen, um das ganze zu verdeutlichen.
JList.jpg

EDIT: das Bild hört dooferweise einfach auf. Dieser Link führt zum ganzen Screen: http://upload.worldofplayers.de/files4/JList.jpg

Ich will in diesem Beispiel, dass er die Zahl 1 löscht! Also den Block <0|0>. Er löscht aber den ganzen Block 0, und somit auch alle anderen Indices, die markiert sind.

Ich danke schon im Voraus für eure Hilfe!
 
Ist klar, denn du hast eine Liste von Listen von ints. An erster Stelle speicherst du die Liste von selektierten ints. Wenn du das löscht, ist sie weg. Du brauchst keine Liste von int-Arrays, sondern nur eine Liste von ints. (1-dimensional)

Java:
int[] selected =  jlist.getSelectedIndices();
List<Integer> list = new ArrayList<Integer>(selected);
list.remove(0); // löscht nur den ersten int
 
Hab's versucht. Hört sich an sich nicht schlecht an, aber folgende Probleme treten auf:

The type List is amibugous (zweideutig).
The constructor ArrayList<Integer>(int[]) is undefined

Nach import java.awt.List; tritt folgendes auf:

The type List is not generic; it cannot be parameterized with arguments <Integer>
(und wieder das mit ArrayList constructor)

Was machen?
 
Hmm für die Templates war doch Integer als Kapselung von int da. Probiers mal mit Integer[] auf jedenfall solltest du java.util.List importieren und nicht java.awt 😉
 
Ich habe schon standardmäßig java.util.* und java.awt.* etc. importiert ^^
Ich probier das aber dennoch mal aus.
 
das problem ist das du beides importiert hast. Da es nun zweimal List gibt weiss java nicht was du willst. Da musst du nun natürlich explizit aufrufen was du construieren willst 😉
Java:
java.util.List<Foo> myList = new java.util.ArrayList<Foo>();
daher meint wohl java das der Constructor Ambigious ist.
 
Sorry, ich steh grad total aufm Schlauch!

Hab dein Geschriebenes kopiert, dann kommt folgendes:

Multiple markers at this line
- Foo cannot be resolved to a type
- Syntax error on token ";", delete this token
- Cannot invoke add(int[]) on the array type List[]
- Foo cannot be resolved to a type

Wenn ich jetzt
Java:
java.util.List<Integer> myList = new java.util.ArrayList<Integer>();
mache, zeigt er mir keinen Fehler an. Aber wie füge ich dann dort die ganzen indices von selected ein?
 
Danke vielmals! Ich bin schon erheblich weiter.
Jetzt sieht mein Quellcode so aus:

Java:
while (jlist.getSelectedValue() != null)
						{
							int[] selected = jlist.getSelectedIndices();
							java.util.List<Integer> indices = new java.util.ArrayList<Integer>();
							for (int i=0; i<selected.length; i++)
							{
								indices.add(selected[i]);
							}
							for(int i = 0; i < (selected.length) ; i++)
							{
								ausgabeLabel.setText(liste.bestLoeschen(jlist.getSelectedValue().toString()));
								indices.remove(0);
								for (int j=0; j<indices.size(); j++)
								{
									indices.set(j, indices.get(j)-1);
								}
								jlist.setListData(liste.listeAusgeben());
								jlist.setSelectedIndices(indices);
					        }
						}

Alles gut soweit. Nur bei der letzten Zeile
Java:
jlist.setSelectedIndices(indices);
kommt der Fehler: The method setSelectedIndices(int[]) in the type JList is not applicable for the arguments (List<Integer>)
Ich muss das irgendwie in int[] umwandeln... <.< Bin mit Eclipse die ganze Methoden Liste durchgegangen, aber es gibt nur indices.toArray(); > dann kommt das selbe nur mit Object[]...
Gibt es denn keine Möglichkeit? 🙁 Bitte um Hilfe!
 
Statt "indices" könntest du ja "selected" nehmen. Sind soviel ich sehe, die gleichen Zahlen. Könnte aber ein Problem geben, wenn dein grösster Index grösser als die Länge der JList ist.
 
Wäre die Lösung so einfach, wäre ich schon drauf gekommen :/
Der löscht ja pro Schritt immer den ersten markierten Eintrag. Dann rücken alle anderen markierten Einträge in der JList um eins vor, also müssen alle markierten Indices <index-1> gemacht werden (und der erste markierte natürlich gelöscht). Das ganze habe ich ja in Verschachtelungen von Integer-Listen dargestellt. Ich konnte bei der <Integer>List mehrere Indexe hinzufügen, aber ich hab keine Ahnung, wie ich aus diesen Indices der <Integer>List ein int[] mache...
Das ist die letzte Hürde, dann sollte die Methode klappen!
 
Ich hab's mir nicht genau angeschaut, aber ich fange beim Löschen aus einer Liste normalerweise hinten an, damit ich das Indexverschieben ignorieren kann. Hoffe, das hilft.
 
Wenn du aus indices ein int[] Array machen willst, musst du foldendes tun:
Java:
int[] array = new int[indices.size()];
for (int i=0;i<indices.size();i++) {
	array[i] = indices.get(i);
}
jlist.setSelectedIndices(array);
 
Java:
for (int j=0; j<indices.size(); j++)
{
        indices.set(j, indices.get(j)-1);
}

Das ist absoluter Blödsinn 😉
1. eine List regelt ihre Indizes intern. Da musst du nix verschieben
2. Du tust das hier nach dem remove(0), willst also den neuen ersten (der davor der zweite war), an die Stelle -1 verschieben
3. Aber selbst hier hast du nen Flüchtigkeitsfehler, was auch der Grund ist dass das hier überhaupt ohne Exception durchläuft. Du dekrementierst einfach jeden Index, also aus der User-Selektion von {4,6,8} wird plötzlich {5,7}, dann {6}. Das macht keinen Sinn.

Warum du auch noch ne for-schleife für den Index hast, also die Selektion irgendwie zig mal neu setzt, versteh ich dann gar nicht mehr, das verpeilt mich grad zu sehr.
Auf jeden Fall machst du das grad extrem umständlich und falsch.. Was hast du denn eigentlich vor?
 
Stimmt! Stimmt! Stiiiiimmt! 😀
javimka, du bist mein Held!
Wieso bin ich nich selbst draufgekommen? Ich hab mir indoktrinieren lassen, dass wenn man arrays erstellt, man sie danach nicht mehr beeinflussen kann und so. Aber dennoch: Danke! 😀
Jetzt kann ich gut schlafen. =)
 
Ähm.. ich möchte nur nochmal auf meinen Post aufmerksam machen. Ich weiss nicht genau was du hier tun willst, aber das sieht sehr falsch aus. Du veränderst die User-Selektionen, ist dir das klar?
 
hdi, nein, ist es nicht..
Ich habe, sagen wir mal, 5 Einträge in der Liste.
Eintrag 0, 3 und 4 werden markiert und ich drücke die Entf-Taste. (eintrag 0 = 1. eintrag)
Dann führt er folgenden Befehl aus:
Java:
liste.bestLoeschen(jlist.getSelectedValue().toString());  //löscht den ersten markierten Eintrag aus der Hauptliste (also Eintrag 0)
indices.remove(0); //löscht den ersten markierten Eintrag aus der ArrayList, somit ist der zweite Eintrag mit Wert 3 hier.
for (int j=0; j<indices.size(); j++)
{
        indices.set(j, indices.get(j)-1);
//Davor steht der <2. markierte Eintrag mit dem Wert 3> bei indices ganz oben (da ja davor Platz 0 gelöscht wurde), also auf Platz 0. 
//Da der Eintrag, der davor oben war, gelöscht wurde, sind nun in der Hauptliste alle eins weiter nach oben gerückt. 
//Das heißt, ich muss den Wert des <2. markierten Eintrags mit dem Wert 3> auf den Wert 2 runterschrauben. 
//Das macht er hier. Das selbe macht er mit den restlichen Einträgen!*/
}
Verstanden?

edit: Und was meinst du damit, ich verändere die User-Selektionen?? ???:L
 
Zuletzt bearbeitet:
Achso, okay das hatte mich verplant. Sorry, danke für die Erklärung 🙂 Trotzdem erscheint mir das etwas kompliziert gemacht. Was nutzt du denn für ein Model? Ist die "liste" dein JList-Model? Also, wenn nix dagegen spricht nimm doch einfach ein DefaultListModel, dann wird das löschen weit weniger umständlich.
Es erscheint mir einfach ein wenig redundant dass du da noch eine Variable "liste" hast mit komplett eigenen Methoden, und sowas wie
Code:
jlist.setListData(liste.listeAusgeben());
sieht danach aus als würdest du quasi zwei Models haben und immer hin und her kopieren und die synchronisieren.

Aber, da irre ich mich jetzt vllt auch. Naja, solange du sicher bist dass alles passt, ist ja okay 😉
 
Also ich gehe jetzt mal explizit auf dein Geschriebenes ein.
Das Ziel dieser Liste ist es, verschiedene Möglichkeiten zu repräsentieren...
Die JList in diesem Sinne ist eigentlich nur ein Darstellungsmodell von einer anderen Klasse 'Liste'. Wenn du willst, kann ich es dir ja hochladen.
Die Liste hat einen Knoten als 'anfang' und jeder Knoten verweist auf den nächsten Eintrag in der Liste, seinem nachfolger.
Bevor ich zur JList übergegangen bin, habe ich mit einem TextArea gearbeitet. Das heißt, er hat mir alle Einträge der 'Liste' dort per <String listeAusgeben();> auf dem TextArea dargestellt. Als ich dann gestern mit etwas Rumspielen die JList entdeckt habe, wollte ich meine Basis behalten, nur das GUI verändern und den Rest auf eine JList spezialisieren. Ich habe die Methode bestLoeschen (d.h. bestimmten Eintrag löschen), welcher den String des markierten Eintrags an die Hauptliste weitergibt, wo dann alle Einträge durchforstet werden, bis dieser Eintrag dann schließlich gelöscht wird. Danach haben wir in der JList die gesamte List ohne eben den gelöschten Eintrag, der zugleich der erste markierte (oder der einzige markierte) war. Dann werden, wie du bereits erwähntest, alle Indices im gespeicherten Array um eins nach unten verschoben und der erste gelöscht. Das bewirkt, dass der zuvor zweit markierte Eintrag der erst markierte Eintrag wird und er den zuvor ersten löscht. Das passiert nacheinander, bis alle markierten Einträge in der Hauptliste, in indices und in JListData gelöscht wurden.

P.S.: Ist vielleicht wirklich umständlich 😀 Aber wir machen das grad in der Schule und so ^^. Also das mit TextArea haben wir dort gemacht. Die halten mich da schon alle wegen Freaks, weil ich viel weiter bin und dauernd programmiere... Nach den Ferien stelle ich dann dieses Modell vor oder so, dann werde ich als endgültiger verdammter Nerd abgestempelt. xD
 
Zuletzt bearbeitet:
Zu 2.) Ich bin davon ausgegangen dass das ein Fehler war, deshalb habe ich bei 3.) das geschrieben, das du tatäschlich auch tun wolltest, wie sich herausgestellt hat 😉

Zum Rest: Du musst abschätzen inwiefern hier ein Refactoring lohnenswert ist. Es ist halt so dass JList ein ListModel hat. Das sind die Daten, die sie darstellt. Man kann ihr einfach ein Array geben, aber das anpassen im Nachhinein wird dann etwas kompliziert. Es gibt eine ziemlich gute Implementierung dieses Interfaces: DefaultListModel.
Wenn du deine Klasse "Liste" von DefaultListModel erben lässt, hast du viele Methoden zur Verfügung zum einfachen Löschen, Hinzufügen etc der Daten.
Der Vorteil gegenüber deiner Liste-Klasse wäre vorallem, dass diese Implementierungen sog. "fire"-Methoden anbieten. (Beim AbstractListModel, das DefaultListModel übernimmt sogar das) Diese Methoden sorgen dafür dass sich die GUI, also die JList, updatet. Sonst müsstest du das per Hand tun, und das ist alles andere als einfach. Vllt hast du bisher keine Probleme gehabt, kommt drauf an was oder wieviel du da in der Liste änderst.

Also summed up: Wenn man eine JList benutzt, sollten die zugrunde liegenden Daten auch ein ("echtes") ListModel sein, da diese zwei Dinge nun mal für einander gemacht worden sind.

Zum besseren Verständnis kannst du dir folgendes durchlesen:
How to Use Lists (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components)
Da kommt dann auch was mit dem ListModel vor...
 
Zuletzt bearbeitet:
Ich verstehe. Aber wir machen das ja momentan in der Schule, und ich will 1. nicht in ganz andere Gebiete übergehen und 2. will ich die Liste, die ich schon habe, selbstständig erweitern und 'an meine Grenzen' gehen xD... Eigene Methoden entwerfen und so. Du kannst ja im Screen meines ersten Posts das GUI rechts unten sehen. Alle Buttons, die dort vorkommen, zeigen funktionierende Methoden meiner Liste. Weil ich ja gestern JList entdeckt habe, wollte ich das mit der Entfernen Taste gleich reinbauen, und da hatte ich dann eben mein erstes richtiges Problem, bei dem ich nicht weiterkam, weil ich auf auf Gebieten wie Arrays oder ArrayList oder sonstigem so gut wie 0 bewandert war. Aber jetzt sieht das schon relativ anders aus ^^.
Ich muss dann mal gucken, was ich als nächstes in meine Liste einbaue. Aber trotzdem danke für deinen Tipp 🙂
 
Falls du Ideen brauchst:
- Alle doppelten Einträge entfernen
- Alle Einträge, die eine Bedingung erfüllen löschen (z.B. Kleiner als 5)
- Selektierte Einträge kopieren/einfügen
- Drag&Drob (schwierig)
 
Was meinst du mit Kleiner als 5?
Also jeder Eintrag, der weniger als 5 Zeichen im Namen hat?

Okay, Drag and Drop wird ja wirklich sehr schwer ^^ Naja, die Ferien habe ich Zeit.
Gibt es eigentlich ne Methode, aus einem String den ersten Integer rauszulesen?
Also z.B. "#4 Jonas", dass er mir 4 zurückgibt?
 
Zuletzt bearbeitet:
Ich dachte eher an Zahlen Einträge oder auch an ein Kriterium wie "kleiner als 'Karl'" im alphabetischen Sinne, aber lass deiner Fantasie freien Lauf 😀
 
Wie soll ich denn bei Drag'n'Drop machen, dass der Eintrag der Maus folgt? Spätestens, wenn ich dann mit Eintrag außerhalb des Frames geraten würde, würde der Eintrag nicht mehr folgen, oder?

P.s. Frage aus meinem letzten Post beantworten, bitte 🙂
 
Ich wüsste keinen einfachen Befehel dazu. Du müsstes wohl durchiterieren und mit charAt(i) den i-ten char auslesen und dann schauen ob er im Bereich [48,57] liegt. Das sind die Zahlen 0 bis 9.

Drag&Drop ist wirklich sehr schwer 😉
 
Ja, oder so. Ich bräuchte nämlich immer in meiner Liste den 2. Char im Eintrag, damit er die Nummer überprüft. "#1 xyz", "#2 xyz2" etc. Weil momentan liest er den ganzen String raus und gibt ihn an die Liste weiter. Wenn die Liste dann einen String wie '#1 xyz' erhält und diesen mit allen Einträgen prüft, kommt sie nicht weit, da sie höchstens 'xyz' finden würde. Deshalb müsste ich jedem Eintrag eine Nummer zuweisen, und somit soll er dann immer den 2. Char (die Zahl des Eintrags) an die Liste geben und diesen Eintrag löschen. Außerdem wird damit verhindert, dass bei doppelten Einträgen der erste übereinstimmende Eintrag gelöscht wird.
Deshalb genügt mir eigentlich die von dir gegebene Methode! Danke vielmals 🙂
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben