Stimmt dieser Java code zur GUI Programmierung?

...komplette Frage anzeigen

2 Antworten

An sich sollte das so gehen, allerdings hat deine "addOrReplaceProduktentwurf" einen kleinen Logikfehler:

Du gehst die Liste mit bisherigen Produktentwürfen durch und überprüfst bei jedem, ob "produkt" und "produktentwurf" übereinstimmen, wenn ja ersetzt du den jeweiligen Entwurf, wenn nein, fügst du ihn hinzu.

Das führt allerdings zu folgendem:

Wir haben z.B. 5 Entwürfe in der Liste und der mit "produkt" Übereinstimmende steht ganz am Ende. Dann hätten wir nach dem Durchlauf von "addOrReplaceProduktentwurf" 9 Einträge in der Liste, von denen die letzten 5 identisch wären...

Deswegen: Zuerst die "Lagerbestände" komplett überprüfen, dann entsprechend handeln.

Hier noch ein angepasste Version von "addOrReplaceProduktentwurf" : https://pastebin.com/0B8btqm1

Antwort bewerten Vielen Dank für Deine Bewertung
Ranaros 17.06.2017, 14:16

Ja das ist mir nicht aufgefallen, danke :D Aber irgendwie verstehe ich deinen code noch nicht so ganz. Nehmen wir mal an, dass die For each schleife 5 Objekte überprüft, an der zweiten Stelle ist ein identisches Objekt, dadurch wird newProdukt auf false gesetzt und break tritt ein. Was ist aber wenn auch an der dritten Stelle ein identsiches Objekt ist? Denke ich gerade falsch? Ich überlege gerade ob es überhaupt möglich ist, dass eine arraylist gleiche Produkte hat, kann  man den break Befehl nicht einfach weglassen? :D 

0
Isendrak 17.06.2017, 14:28
@Ranaros

Wenn du zum einfügen/ersetzen immer nur die "addOrReplaceProduktentwurf" verwendest, können keine zwei Objekte in der Liste sein, die bezogen auf ".equals()" identisch sind.

Das heisst, wenn an Position 2 ein solches Objekt ist, kann an keiner anderen ein ebenfalls identisches liegen.

[Tipp: Skizzier dir evtl. mal den Ablauf mit Stift und Papier. Das hilft manchmal ziemlich gut dabei, nachzuvollziehen, was falschläuft bzw. was überhaupt läuft.]

Also musst du nur bis zum ersten Auftreten eines identischen Objektes durch die Liste iterieren. Alles andere wäre ineffizient. Und genau deswegen wird die Schleife mit "break" abgebrochen.

P.S.: Ja. ne ArrayList kann "technisch" gesehen mehrere indentische Objekte enthalten. Das geht "sogar" mit ner HashMap (sofern die Schlüssel nicht identisch sind ;)

1
Ranaros 17.06.2017, 14:46
@Isendrak

Achso :) Ja dann werde ich das mal ändern, Danke :)

Könntest du mir vielleicht noch bei was anderem helfen an dem ich gerade arbeite? :D

Ich soll 2 combo boxen befüllen. Die Daten die in diese zwei Boxen rein sollen, kommen aus der arraylist produktentwürfe. 

Hier die Aufgabe:

Definieren Sie im InputPanel eine Methode public void updateData(). Hier müssen die JComboBoxen entleert und mit den Namen aller Produktentwürfe neu befüllt werden. Nutzen Sie dafür die Methode addItem(String item). Anschließend soll das JLabel für den Betrag des Testguthabens auf das aktuelle Testguthaben gesetzt werden. Um die Implementierung zu nutzen müssen Sie in den Methoden des PanelManagers  addOrReplaceProdukt(Produkt produkt), addMaschineToFabrik(int index), removeMaschineFromFabrik(int index) jeweils die Methode updateData() aufrufen.

Das habe ich gerade geschrieben: 

https://hastebin.com/eyiqibaxen.cpp

Problem dabei ist, dass ich bei einem erneuten Aufruf von addItem die Namen die vorher gespeichert wurden, überschrieben werden :/ Kannst du mir da evtl weiterhelfen? :D Was könnte ich verbessern oder ändern? :)

Die Comboboxen habe ich auch dabei geschrieben, der Konstruktor von denen ist doch richtig oder?

0
Isendrak 17.06.2017, 15:08
@Ranaros

Ich vermute mal, mit

Nutzen Sie dafür die Methode addItem(String item).

ist diese Methode gemeint: http://docs.oracle.com/javase/6/docs/api/javax/swing/JComboBox.html#addItem%28java.lang.Object%29

Was könnte ich verbessern oder ändern?

Etwas in der Art:

public void updateData() {
jcbErzeugnis.removeAllItems()
jcbBedingung.removeAllItems()
ListIterator listIterator = panelManager.getProduktentwuerfe().listIterator();
while(listIterator.hasNext()) {
Produkt produkt = listIterator.next();
jcbErzeugnis.addItem(produkt.getname());
jcbBedingung.addItem(produkt.getname());
}
}
1
Ranaros 17.06.2017, 15:25
@Isendrak

Achsoo, ja da habe ich nicht drauf geachtet, hätte sehen müssen, dass er davor kein public void geschrieben hat, macht er sonst immer wenn man eine eigene schreiben muss. 

Ich bekomme aber noch folgende Fehler angezeigt:

public void updateData() {

jcbErzeugnis.removeAllItems();
jcbBedingung.removeAllItems();
ListIterator listIterator = panelManager.getProduktentwuerfe().listIterator();
while(listIterator.hasNext()) {
Produkt produkt = listIterator.next();
jcbErzeugnis.addItem(produkt.getname());
jcbBedingung.addItem(produkt.getname());
}
}

bei public void updateData() { steht : Multiple markers at this line
- Syntax error, insert ";" to complete LocalVariableDeclarationStatement
- void[] is an invalid type
- Syntax error on token "updateData", AnnotationName expected after
this token
- Illegal modifier for parameter updateData; only final is permitted
- Syntax error, insert "[ ]" to complete Dimension

Und die Zeilen:

jcbErzeugnis.addItem(produkt.getname());

jcbBedingung.addItem(produkt.getname());
JComboBox jcbErzeugnis = new JComboBox();

JComboBox jcbBedingung = new JComboBox();

sind gelb unterstrichen, ich glaube da fehlen Parameter, was genau muss ich denn übergeben?

Danke :)

0
Isendrak 17.06.2017, 15:36
@Ranaros

bei public void updateData() { steht : Multiple markers at this line

 .....

Das sieht so aus, als hättest du den Code an der falschen Stelle eingefügt. Dazu wäre der gesamte Code hilfreich (hastebin, pastebin, o.ä.).

sind gelb unterstrichen, ich glaube da fehlen Parameter, was genau muss ich denn übergeben?

Die sollten so eigentlich in Ordnung sein. Das "gelb unterstrichen" klingt nach einer "Warnung" in Eclipse. Sollte also kein Problem sein, kommt aber ggf. drauf an, was genau die Warnung besagt.

1
Ranaros 17.06.2017, 15:50
@Isendrak

Type safety: The method addItem(Object) belongs to the raw type JComboBox. References to
generic type JComboBox should be parameterized

Das steht bei:

jcbErzeugnis.addItem(produkt.getname());

jcbBedingung.addItem(produkt.getname());

Multiple markers at this line
- JComboBox is a raw type. References to generic type JComboBox
should be parameterized
- JComboBox is a raw type. References to generic type JComboBox
should be parameterized

Das steht bei:

JComboBox jcbErzeugnis = new JComboBox();

JComboBox jcbBedingung = new JComboBox();

https://hastebin.com/yiqewobobe.swift

Da gibt es noch einen Fehler für eine try/catch funktion. Das funktioniert bei mir noch nicht so ganz, also die exceptions werden nicht aufgefangen. Das sollte aber nichts mit den anderen Fehlern zu tun haben.

0
Ranaros 17.06.2017, 16:13
@Ranaros

Ich kann deswegen auch nicht die Methode updateData() in den anderen Methoden aufrufen, steht ja in der Aufgabe, dass ich das so machen soll:

Um die Implementierung zu nutzen müssen Sie in den Methoden des PanelManagers  addOrReplaceProdukt(Produkt produkt), addMaschineToFabrik(int index), removeMaschineFromFabrik(int index) jeweils die Methode updateData() aufrufen.

0
Isendrak 17.06.2017, 16:16
@Ranaros

Da gibt es noch einen Fehler für eine try/catch funktion.

Ahem, try/catch Block... Bei dem war das Problem, dass du im Grunde gesagt hast "Versuch einen ActionListener zu erstellen, und wenns funktioniert, keine weitere Fehlerbehandlung innerhalb der 'Action'.".

Der try/catch Block muss innerhalb von "actionPerformed" im ActionListener platziert sein, damit er jedesmal ausgeführt wird, wenn eine "Action" ausgelöst wird.

bei public void updateData() { steht : Multiple markers at this line ......

Das liegt daran, dass die Methodendeklaration/implementierung innerhalb von "buildGUI" steht, dabei müsste sie direkt innerhalb der Klasse stehen.

is a raw type. References to generic type JComboBox

Ersetze jedes "JComboBox" durch "JComboBox<String>", dann sollte es laufen.

Hier noch eine korrigierte Version: https://pastebin.com/vTd1ce0e

1
Ranaros 17.06.2017, 17:02
@Isendrak

Ich hab versucht deine Vorschläge zu übernehmen, ich bekomme aber leider immernoch ein paar Fehler angezeigt:

Multiple markers at this line
- Syntax error on token ")", delete
this token
- The constructor JLabel(double) is
undefined
- The constructor JLabel(double) is
undefined

Bei:

JLabel jlbWertDesTestguthabens = new JLabel(panelManager.getTestguthaben());

In ein Label kommt ja eigentlich nur ein String rein, ich hab deswegen vorher versucht das Testguthaben vom Typ double in String zu konvertieren.

Meine Comboboxen sehen jetzt so aus:

JComboBox<String> jcbErzeugnis = new JComboBox<String>();

JComboBox<String jcbBedingung = new JComboBox<String>();

Sind die jetzt richtig? Ich bekomme nämlich noch keine Ausgaben in den boxen angezeigt. Ich glaube weil ich auch noch keine Produktentwürfe in der ArrayList produktentwürfe habe.

https://hastebin.com/qizovapasi.swift

Als ich in meinem Fenster ein neues Produkt anlegen wollte, habe ich nur die zweite Meldung aus dem try/catch Block erhalten, als ich das auskommentiert habe, wurde mir eine nullpointerexception angezeigt, ich glaube es liegt an dem Methoden aufruf von UpdateData() in der Methode AddOrReplaceProduktentwurf(Produkt produkt). Also Wenn ich ein Produkt hinzufüge, wird es sofort wieder gelöscht, sehe ich das richtig? Oder werden in updateData() nur die boxen geleert, wo vorher das Produkt drin war? Warum sehe ich denn jetzt noch nichts in den combo boxen? :)

0

Zur Bewertung wäre der ganze Quellcode eher relevant. Syntaktisch sieht es zumindest korrekt aus.

Antwort bewerten Vielen Dank für Deine Bewertung

Was möchtest Du wissen?