Java code hilfe?
Habe ein Schere Stein Papier Spiel in BlueJ programmiert.
Dort gibt es ein Fenster mit Knöpfen und dadrin öffnet sich noch ein anderes Fenster dieses möchte ich per Knopf im zweiten Fenster auch wieder schließen.
Habe es wie es unser Lehrer es uns fürs ganze Fenster gezeigt hat mit fenster.gibFrei versucht aber das geht nicht.
(Bitte sagt nicht das der Code keinen Sinn macht oder versucht ihn grundlegend zu ändern, da es die Vorlage von meinem Lehrer gibt.)
https://pastebin.com/rid3iiNH
Pastebin link








2 Antworten
Das Problem an dieser Stelle ist, dass ihr in der Schule mit einer Bibliothek arbeitet, die öffentlich so gut wie nicht dokumentiert ist (ihr bindet dazu das Package basis ein). Könntest du bitte einmal die JAR-Bibliotheken teilen (bspw. via https://www.file-upload.net/ o.ä.)? Mit diesen dürfte dein Problem reproduzierbar und besser zu analysieren sein.
Die JAR-Bibliotheken dürften im BlueJ-Installationsordner unter lib\userlib liegen (zippe am besten einfach das komplette Verzeichnis).
Du hast ein Fenster mit der Größe von 620x200 Pixel. Das Beschriftungsfeld bf5 (übrigens doppelt) liegt bei einer vertikalen Höhe von 30 Pixel und nimmt 160 Pixel an Höhe ein (geht also bis zu y=190). Nun kommt dein nicht klickbarer Button, der auf der Höhe von 150 Pixel liegt, mit einer Höhe von 30 Pixel (er liegt also zwischen y 150-180). Es wird also ersichtlich, dass sich Button und Label perfekt überschneiden, bzw. das Label überdeckt den Button. Wieso hier nicht die z-Reihenfolge gilt (was zuletzt kommt, überdeckt alles andere), kannst du ja einmal deinen Lehrer fragen.
Mache dein Fenster etwas größer und rücke den Button etwas weiter nach unten.
Danke ich hatte garnicht bemerkt, dass sich der Knopf nicht drücken ließ.
Jetzt bleibt immernoch die Frage, wie ich das zweite Fenster mit dem Knopf schließe
Aja, die Ereignisbehandlung muss genauso ablaufen, wie bei den anderen Buttons: In einer eigenen Schleife. Der Aufruf von kurzePause ist notwendig, damit die Anwendung nicht einfriert bzw. eine Interaktion möglich ist, während die Schleife läuft.
// innerhalb if, wo Hilfefenster erzeugt wird ...
while (true) {
Hilfe.kurzePause();
if (kHilfeEnde.wurdeGedrueckt()) {
fenster1.gibFrei();
break;
}
}
}
// ...
Solltest du im Übrigen jemals nochmal GUI-Programmierung mit Java (nach der Schule / in deiner Freizeit) lernen wollen: Vergiss das, was du mit dieser basis-Bibliothek gelernt hast. Hier wurde so einiges verdreht und verbogen, wohl mit dem Gedanken, es würde so einfacher werden. Es ist m.E. aber eher großer Mist.
Im eigentlichen Spiel haben wir nur das eigentliche Spiel mit Punktezähler
Wir durften noch Kreativ werden, wie z.B. mit der Anzeige wer führt oder dem Hilfefenster.
Das gibt dann Extra-Punkte
Hast du noch Ideen was man sonst noch einbauen kann?
- Ein Button, der für dich eine zufällige Wahl vornimmt.
- Eine Personalisierung (Spieler muss erst seinen Namen eingeben, dieser wird folglich als Anrede benutzt)
- Ein Countdown / Timer, sodass der Spieler mehr unter Druck gerät.
- Beim Gewinnen / Verlieren könnte sich das Fenster noch farblich anpassen (Hintergrundfarbe: rot/gelb/o.ä.)
Danke für deine Ideen
Ich finde den Vorschlag mit der Hintergrundfarbe interessant.
Mit welchen Befehl ließe sich das umsetzen?
Das Fenster besitzt eine Methode setzeHintergrundfarbe, der man Instanzen von Color übergeben kann.
Ah ok danke
Ist das wieder ein Befehl vom Paket?
Und falls ja wie konntest du das herausfinden?
Ja. Alle Elemente, die irgendwelche deutschen Wörter im Namen haben, kommen von der basis-Bibliothek.
Ich habe die JAR-Bibliothek bei mir in NetBeans eingebunden, nicht in BlueJ. Die IDE stellt mir Funktionen zur Verfügung, um bspw. in Klassen fremder Bibliotheken hineinzuhüpfen und mir zumindest die verfügbaren Methoden anzuschauen. Auch eine Autosuggestion ist vorhanden, d.h. NetBeans bietet mir bereits beim Schreiben eine Droplist an, die alle verfügbaren Methoden auflistet.
Ob BlueJ ebenso eine Autosuggestion zur Verfügung stellt, weiß ich gerade nicht.
Wenn du den kompletten Quellcode einsehen wolltest, solltest du dir einen Decompiler besorgen. JD-GUI ist da nicht schlecht.
Ok danke
Könntest du mir dann als letztes noch die Syntax vom Befehl setzeHintergrundfarbe
Sagen wenn du weißt was ich meine?
Mit dieser Fehlerbeschreibung kann ich nicht viel anfangen.
Hat sich erledigt.
hätte aber noch eine andere Frage.
Ich wollte jetzt das Spieler1 Eingabe per Knopf durch Zufall getätigt wird.
Allerdings funktioniert der switch dafür nicht.
Hier der pastebin link:
Du brauchst erst einmal nur einen Würfel.
Random wuerfel = new Random();
Die Variable wuerfel1 kann raus.
Beim zweiten switch in spielStart wird dein Compiler streiken, denn du definierst die Variable nur, wenn der Button gedrückt wurde. Ansonsten hat sie keinen expliziten Startwert. Also: Setze einen Startwert für die Variable.
Mir fällt übrigens gerade auf, dass deine Spieloberfläche ziemlich intransparent für einen Spieler ist. Er klickt auf irgendeinen Button, doch er weiß danach nur das Ergebnis. Aber nicht, was der Gegner für einen Zug vollführt hat oder was dein Programm für einen Zufallswert berechnet hat.
An sich könnte sogar zufall1 entfernt werden. Die Berechnung eines Zufallswert findet sowieso nacheinander statt. Nach dem ersten switch könnte zufall also neu definiert werden. Da die Variable nur innerhalb der Schleife benötigt wird und ihren Wert nicht iterationsübergreifend kennen muss, könnte die Deklaration in den Schleifenkörper verlegt werden.
Da habe ich auch schon dran gedacht mit 0 ging es nicht da dann die ganze Zeit Papier ausgegeben wird
Ich kann gerafe nicht mehr an den Rechner, aber eigentlich dürfte es ja kein Problem geben, wenn ich Zufall1 auf 3 setze, da dann ja nicht gespielt wird
Oder?
Du brauchst es doch eigentlich nur so formulieren, wie du es oben bereits getan hast (naja, so halbwegs zumindest). Es darf nur eine zufällige Eingabe (eingabeSpieler1) ermittelt werden, wenn der Button gedrückt wurde. Das heißt, der zufallswert wird innerhalb des if definiert und das switch liegt ebenso im if.
Bitte sagt nicht das der Code keinen Sinn macht oder versucht ihn grundlegend zu ändern, da es die Vorlage von meinem Lehrer gibt.
Dein Lehrer macht aber nicht die Vorlage, dass du keine Formatierungen benutzen sollst. Wie wäre es mal mit Einrücken von Codeabschnitten?!
Ansonsten bitte hastebin.com oder pastebin.com benutzen.
Ich habe mal deinen Code formattiert: https://hastebin.com/ufanawamox.java
Kannste mit dieser Webseite auch selbst machen: https://www.tutorialspoint.com/online_java_formatter.htm
Und dort sagst du mir bitte nun, wo du was machen willst.
Guck dir deinen Code an und guck dir den Code an, welchen ich in hastebin gepackt hat. Fällt dir was auf?
Richtig, das nennt man formatieren.
Das Fenster wird aufgerufen und dort hast du dann ein Knopf, mit dem du das Fenster wieder schließen willst ...
if (kHilfeEnde.wurdeGedrueckt()) {
fenster.gibFrei();
}
Steht im Codeblock der if- Abfrage vom Hilfe Button gedrückt drin, sollte der nicht außerhalb sein?
Was weißt du nicht? Weißt du nicht, was du da Programmiert hast oder was?
doch aber es geht auch draußen nicht.
Schau in deine Unterlagen rein, sowas sollte man am Anfang lernen.
Wenn du das nicht weißt, sorry, dann musst du dich selbst schlau machen. Ich bin nicht dein Lehrer. Wenn dein Lehrer dir sowas nicht beibringt, ist das die Sache deines Lehrers und daher nicht meine Aufgabe. Sorry!
Ich habe erst seit diesem Schuljahr Informatik
Die Antwort war nicht sonderlich hilfreich
Hilfreich ist er schon, nur kannst du damit nichts anfangen, weil dir die Grundlagen fehlen.
Schon ein Unding, dass euer Lehrer mitten in der Materie anfängt, statt euch die Grundlagen beizubringen.
Ja das bringt mich jetzt ehrlich gesagt gar nicht weiter.
Deswegen für mich weniger hilfreich.
https://www.file-upload.net/gal-294597/74jhn3/1.html
So das sollte es sein