Also ich habs grad mal in Eclipse mit Java 1.7 gestartet, da kann er mit JNumberField nichts anfangen, hab das also erstmal auskommentiert. Dann funktioniert der Start aber problemlos.
Daher: Welche Java-Version und welche Entwicklungsumgebung verwendest du? Und wie kompilierst du?
PokéDex - ArrayList Problem
-
- Java
- DasOlli
Wir sammeln alle Infos der Bonusepisode von Pokémon Karmesin und Purpur für euch!
Zu der Infoseite von „Die Mo-Mo-Manie“-
-
Ich benutze den JAVA Editor 12 mit dem JDK 7.1.0
Starten tut das Programm bei mir ja auch, nur es passiert halt nichts wenn ich etwas ins jTextField eintrage.Und ich kenn mich mit ExceptionHandler leider nicht wirklich aus, werde mich da aber gleich mal reinlesen.
-
Das Textfield hat auch keinen EventHandler, da wird nix passieren.
Exception handling ist eines der mächtigsten Tools von Java, da solltest du unbedingt reinschauen :) -
Ich kann weder in Eclipse noch im Java-Editor das Problem nachstellen. In beiden Fällen wird das Pokemon korrekt gesucht und gefunden oder nicht gefunden, je nach Eingabe. Keine Exceptions, keine Probleme.
Vermutungen, die noch bleiben:
Unterschiedliche Java-Versionen (Lässt sich in der Kommandozeile mit "java -version" und "javac -version" prüfen)
Unterschiedliche Compiler- und Umgebungseinstellungen (im Java-Editor -> Fenster -> Konfiguration, dort Interpreter und Compiler) -
Okay, ich habe meine JAVA Version geupdatet und nun funktioniert es! Dankesehr für eure Geduld und Mitarbeit.
Nur jetzt habe ich keine Ahnung wie ich den Arrays mehrere Werte (Nummer und Typ) hinzufügen kann, also bzw. wenn ich auf Suchen klicke, dass mir von dem Pokémon der Name, Nummer und Typ angezeigt wird.
Such Funktion soll für Name (was jetzt erledigt ist) und Nummer funktionieren.
Wie gesagt, mein Problem ist die Zuweisung der ganzen Werte für 1 Array.
-
Erstell eine Klasse "Pokémon" welche den Namen, Typen, die ID und was auch immer du noch haben willst für das Pokémon und mache die Arraylist zu einer ArrayList vom Typ deiner neuen Klasse.
Die Werte liest du dann mit get Methoden aus
-
Da scheitert es jetzt auch schon, habe eine neue Klasse erstellt, die sieht in etwa so aus:
Aber wie mache ich meine ArrayList jetzt zu einer ArrayList vom Typen meiner neuen Klasse? Bzw. wie kann ich denen jetzt die ganzen Werte hinzufügen? Will die ja hinterher ausgeben lassen in einer JListBox.
Danke schonmal !
-
Generell definierst du Attribute generell als private.
Die Wertezuweisung erfolgt über den Konstruktor, das auslesen über get-Methoden.Eine Array List vom Typ Monster definierst du wie eine vom Typ Strimg, nur eben mit Monster.
ArrayList<Monster> liste = new ArrayList<Monster>();
Du solltest dir eventuell erstmal die Basics in Java und Objektorientierung erarbeiten, bevor du ein Projekt wie dieses startest, ansonsten fährst du schnell gegem eine Wand.
-
Okay, wusste das nicht mehr genau wegen Klassen Hirachien.
Wie kann ich denn jetzt nun für den Array-Wert Bisasam einen Typen, einen Namen (der ja eig. vorhanden ist) und eine Nummer hinzufügen? Also das auslesen sollte ich noch hinbekommen, aber die Wertezuweisung fehlt mir.Ja, ich sollte das lieber erst lernen, habe vor etlichen Jahren JAVA in der Schule gehabt, also in der Ausbildung, aber mittlerweile ist es nen bisschen her und ich versuche da halt wieder reinzukommen.
Aber großen Dank an eure Hilfe und Mühe und vorallem die Geduld mit mir.
-
Bin Momentan in der FH, deshalb kann ich dir so am Tablet keinen Code schreiben, daher empfehle ich dir das Stichwort "Konstruktor" zu recherchieren und mit dem Wissen kannst du dann die Zuweisung vornehmen
-
Habe mal gegooglet. Meinst du das in etwa so? Kann verstehen dass es am Tablet etwas schwierig ist. Wenn es so richtig ist wüsste ich nur nicht wie ich jetzt nen 2. Pokémon hinzufügen kann.
Codeclass Monster { private String name; private int nummer; private String typ; ArrayList<Monster> liste = new ArrayList<Monster>(); liste.name="Bisasam"; liste.nummer=1; liste.typ="Pflanze"; }
Danke
-
Ich hab um halb 3 Feierabend, werde danach dir dann schnell was zusammenbasteln. Aber erneut: Lies sich nochmal in OOP ein, das erleichtert dir einiges
-
Code
public class Monster { private String name; private int nummer; private String typ; public Monster(String name, int nummer, String typ) { this.name = name; this.nummer = nummer; this.typ = typ; } public String getName() { return this.name; } public int getNummer() { return this.nummer; } public String getTyp() { return this.typ; }}
Dementsprechend in der anderen Datei dann:
-
Zunächst mal: Der Typ des Pokemon schreit förmlich danach als Enum abgebildet zu werden.
Wäre dann noch die Frage, in welcher Sprache du bisher so programmiert hast. Es entsteht jedenfalls leicht der Eindruck, dass die Grundlagen sowohl in Java, als auch allgemein in Sachen Programmierung bei dir ziemlich lückenhaft sind.
Aber ich will mal durchgehen:
Zunächst mal solltest du die Klasse Monster nicht mit in die PokeDex-Klasse packen, es sieht so aus, als ob das zurzeit der Fall ist. Also eine neue Datei mit dem Namen Monster.java.
Darin dann die Klassendeklaration:Codepublic class Monster { private String name; private int number; private ElementType typ1; private ElementType typ2; //fuer mons mit doppeltyp public Monster(String name) { this(name, null, null, null); } public Monster(String name, int number, ElementType typ1) { this(name, number, typ1, null); } public Monster(String name, int number, ElementType typ1, ElementType typ2) { this.name = name; this.number = number; this.typ1 = typ1; this.typ2 = typ2; } //getter public String getName() { return name; } public int getNumber() { return number; } public ElementType getFirstType() { return typ1; } public ElementType getSecondType() { return typ2; } //ggf setter public void setSecondType(ElementType typ) { this.typ2 = typ; } ... //relativ sinnvoll dürfte equals sein @Override public boolean equals(Monster monster) { return this.getName().equals(monster.getName()); }}
In der ArrayList wird das ganze so gehandhabt:
CodeArrayList<Monster> pokemon = new ArrayList<Monster>();pokemon.add(new Monster("MissingNo", 0, null, null));pokemon.add(new Monster("Bisasam", 1, ElementType.PFLANZE, ElementType.GIFT));...
und das suchen dann:Und das Enum (ebenfalls in einem neuen Java-File)
-
Vielen Dank für die Mühe! Bin euch echt mega dankbar! Ja meine Lehre liegt schon nen paar Jährchen zurück, das ist echt mehr als Lückenhaft. Würde das gerne auffrischen und deshalb mache ich das um da wieder reinzukommen, und ich frag halt wenn ich etwas nicht weiß, ist halt mehr geworden als ich dachte.
Ich habe das nun so gemacht wie ihr mir geraten habt, habe nun in der Klasse "Monster" eine einzige Fehlermeldung.
Compiliere H:\PokeDex2\Monster.java mit Java-Compiler
Monster.java:7:5: error: no suitable constructor found for Monster(String,<null>,<null>,<null>)
this(name, null, null, null);
^
constructor Monster.Monster(String,int,ElementType,ElementType) is not applicable
(actual argument <null> cannot be converted to int by method invocation conversion)
constructor Monster.Monster(String,int,ElementType) is not applicable
(actual and formal argument lists differ in length)
constructor Monster.Monster(String) is not applicable
(actual and formal argument lists differ in length)
1 errorHabe die Pokémon-Liste natürlich bereits erweitert. Habe die neuen Klassen ElementType und Monster in eine extra JAVA Datei reingepackt. Aber sehen die sich überhaupt auch ohne "extends" ?
-
Ja, die sehen sich auch ohne "extends", weil "extends" die Vererbung angibt. Wenn die Klasse im gleichen Package liegt, wird sie ohnehin einfach gesehen, schließlich ist sie public, sonst müsste man sie als import einbinden.
Was den Fehler angeht: Hatte den Code nicht geprüft, aber der erste Konstruktor nur mit name muss natürlich so aussehen:
Alternativ ist durchaus möglich statt des primitiven Typen int das Objekt Integer zu verwenden, das kann dann auch null sein. -
Warum überhaupt überladen? Jedes Pokémon hat nen Typ und ne Nummer, da reicht ein Konstruktor und man macht es dem Olli nicht 10000 mal komplizierter.
-
Überladen ist natürlich nicht zwingend notwendig, aber durchaus sinnvoll, da der Konstruktor tatsächlich selbst im trivialen Fall Name/Nummer/Typ schon zwei verschiedene Fälle gibt, da es bekanntlich Pokemon mit Doppeltypen gibt. Der erste Konstruktor nur mit Namen ist für die Suchfunktion sinnvoll, da man ja in der Liste nach Namen suchen möchte ohne jedes mal manuell durch die Liste zu iterieren. Aus dem gleichen Grund gibt es ja auch die modifizierte equals()-Methode.
Klar, man könnte auch den einen Konstruktor nutzen und die ganzen Aufrufe so gestalten, wie sie derzeit in den weiteren Konstruktoren stattfinden, die Variante mit mehreren Konstruktoren ist jedoch im Gebrauch übersichtlicher und zeigt eindeutiger, welche Parameter man braucht oder weglassen kann, in der Dokumentation ließe sich dann noch erläutern, warum welcher Konstruktor vorhanden ist.