GUI Seiten springen + Timer mit Eingabe

fishhead

Mitglied
Hallo zusammen,

vorneweg, sorry für den vielsagenden Titel dieses Threads.. bin gerade nicht sehr kreativ.

Ich habe zwei Probleme bei denen ich hoffe, dass ihr mich in die richtige Richtung schupsen könnt. Ich möchte nicht sagen, dass ich blutiger Java Anfänger bin, jedoch hab ich mich schon lange nicht mehr damit befasst. Vorallem noch nicht mit GUI-Programmierung. Ich arbeite gerade mit Swing.

Zu den Problemen:
#1 Derzeit habe ich ein JFrame mit einem Textfeld und einem Start-button. In das textfeld soll der user eine sekundenzahl schreiben, wie lange das programm ausgeführt werden soll (es geht um einen reaktionstest). also soll, sobald auf "Start" gedrückt wird, per getText() und parseInt() die Benutereingabe in eine variable geschrieben werden. Kein Problem soweit.
Aber soll auch beim Klicken auf Start man auf eine weitere "Seite" gelangen, auf der quasi der Reaktionstest ausgeführt wird. Ich denke ich könnte auch einfach mein jPanel setVisible(false) setzen. Aber das ist denke ich unschön gelöst. Gibt es da eine elegantere Lösung, um sozusagen auf eine nächste seite Weiterzublättern?

Dannn meine nächste Frage:
#2 Ich habe mir das mit dem Reaktionstest so überlegt, dass für die entsprechende Länge des tests in sekunden auch genauso oft eine funktion ausgeführt wird, welche (so funktioniert der test) immer ein zufälliges Bild aufruft (von vorher gegebenen) und der benutzer je nachdem ob das Bild "richtig" oder "falsch" ist die Taste 1 oder die taste 0 drücken muss. Jedes bild wird exakt 1 sekunde lang angezeigt. in dieser zeit muss der user die eingabe tätigen. danach kommt sofort das nächste bild.

Meine Überlegungen waren, einfach eine schleife zu machen damit je nach vorgegebener sekundenzahl genauso oft eine funktion "Bildanzeige()" ausgeführt wird. Diese Funktion soll dann ein zufälliges bild ausgeben, und einen Actionlistener erstellen, der 1 sekunde auf eine eingabe (0 oder 1) wartet. nach der sekunde soll die funktion returnt werden (was die funktion ja beendet??), wobei er wieder zurück in die schleife springt und dann das nächste bild geladen wird.
Um die eingabe auszuwerten dachte ich mir eine klasse "Pruefbild" zu erstellen, welche einen wert "true" oder "false" hat(also ob das bild stimmt oder nicht) und einen pfad zu einer bilddatei beinhaltet.

Sehr viel text..ich weiß :p
Ich hoff ihr habt ein paar tipps für mich.

Danke :)
 

Michael...

Top Contributor
Zu 1) siehe CardLayout
Zu 2) Hier muss man mit einem Thread oder Timer arbeiten
Ganz allgemein: Die Bilder vorher "gemischt" in einer Liste speichern, entsprechend wird eine Liste zur Speicherung der Antwort erstellt.
Der Thread/Timer zählt eigentlich nur eine Zähler hoch und stößt das Neuzeichnen an.
Entsprechend des aktuellen Werts im Zähler wird ein Bild angezeigt und passend zum Zähler die Antwort des Anwenders gespeichert.
 

fishhead

Mitglied
Danke für die Antwort,

ICh denke das ist aber dann zu statisch wenn ich mit zwei Listen arbeite, ich mein ich könnte die liste ja "randomisieren", aber die zweite liste mit den zugehörigen infos zu jedem bild musste ja dann nach dem selben schema gemischt werden.
Oder hab ichs falsch verstanden?

Wäre doch auch möglich wenn ich mir z.b. (bei 8 Bildern) 8 Objekte aus der Pruefbild Klasse erstelle, und dann die eingabe vergleiche mit dem rückgabewert von bild01.getZustand(). Ich wüsste nur nicht wie ich dann zufällig auf eines der 8 zugreifen soll. Außer ich schmeiß die 8 objekte auch in eine Liste. (dann hätte ich die infos auch immer dabei und die könnten nicht durch falsches sortieren, falsch zugewiesen werden).

...würde das funktionieren?
 

Michael...

Top Contributor
ICh denke das ist aber dann zu statisch wenn ich mit zwei Listen arbeite, ich mein ich könnte die liste ja "randomisieren", aber die zweite liste mit den zugehörigen infos zu jedem bild musste ja dann nach dem selben schema gemischt werden.
Oder hab ichs falsch verstanden?
War jetzt nur als einfaches Bsp einfach mal so runtergeschrieben. selbstverständlich man kann auch eine Liste mit Objekte erzeugen, die zum einen auf das Bild referenzieren und zum anderen die Antwort und evtl. weitere Daten dazu halten können.
Ich wüsste nur nicht wie ich dann zufällig auf eines der 8 zugreifen soll. Außer ich schmeiß die 8 objekte auch in eine Liste
Es macht nur Sinn diese in einer Liste zu halten. Die Klasse Collections bietet eine Methode shuffle(...) um Listen zu mischen.
 
V

vanny

Gast
ein anderer Ansatz(oder auch nur anders gedacht) wäre,
1. Eine eigene Klasse TestBild zu schreiben. Diese hält das Bild, die Antwort und was dir sonst noch einfällt.
2. Die Bildobjekte in eine HashMap speichern und als Key int [0 bis n].
3. eine Collection erzeugen, die die Keys hält, mischen und
4. Wie schon erwähnt nen Thread starten, der die Sekunden zählt und die Bilder wechselt, indem du einfach das TestBild-Objekt über den Key aufrufst.

Sollte man die HashMap shuffeln können fällt Punkt 3 sogar weg ... ich muss leider los und kanns grad nicht nachschaun.

sooo long Vanny
 

fishhead

Mitglied
ja, viele wege sollen nach Rom führen ;)

ich habs jetzt so gemacht, dass ich eine arrayList erstellt habe und darin meine paar Bilder geaddet habe. in meinem TimerTask run() wird zunächst meine "bilderListe" (die arrayList) geshuffelt. und dann woltle ich immer nur das objekt an stelle 0 in der liste mir geben lassen (bilderListe.get(0)) und in einen platzhalter temp oder so speichern. Danach dann das bild per temp.getPfad() und die richtige antwort per temp.getZustand() übergeben.

hier ne abgespeckte version..der übersicht zuliebe
Java:
public List bilderListe = new ArrayList();
public Pruefbild temp = new Pruefbild();
public Pruefbild bild00 = new Pruefbild(true,"/reaktionUI/bild00.jpg");
public Pruefbild bild01 = new Pruefbild(false,"/reaktionUI/bild01.jpg");
//....
bilderListe.add(bild00);
bilderListe.add(bild01);
//....run() 
Collections.shuffle(bilderListe);
temp = bilderListe.get(0);
so mag er das aber nicht..
da schreit netbeans folgendes in der Zeile wo temp initialisiert wird.

incompatible types
required: pruefbild.Pruefbild
found: java.lang.Object

jemand ne idee? ich dacht er würd mir das selbe Objekt geben, dass ich auch reingesteckt habe..??

P.S.: danke für die antworten. auch wenn ich manches nicht genauso umgesetzt habe, waren schlagwörter wie HashMap oder Cardlayout sehr interessant und weiterbildend. Von allein wäre ich auf solche möglichkeiten nie gekommen ;)
 
V

vanny

Gast
also der Ansatz is schonmal voll ok.
also entweder:
Java:
public List<Pruefbild> bilderListe = new ArrayList<Pruefbild>();
public Pruefbild temp;
public Pruefbild bild00 = new Pruefbild(true,"/reaktionUI/bild00.jpg");
public Pruefbild bild01 = new Pruefbild(false,"/reaktionUI/bild01.jpg");
//....
bilderListe.add(bild00);
bilderListe.add(bild01);
//...
Collections.shuffle(bilderListe);
//....run() 
public void setzeBild(){
temp = bilderListe.get(0);
bilderListe.remove(0);//Wenn temp das Bild hat kannste es aus der Collection löschen;P
}
oder:
Java:
public List<Pruefbild> bilderListe = new ArrayList<Pruefbild>();
public Pruefbild temp;
public Pruefbild bild00 = new Pruefbild(true,"/reaktionUI/bild00.jpg");
public Pruefbild bild01 = new Pruefbild(false,"/reaktionUI/bild01.jpg");
private int gezeigteBilder = 0;//0 ist zwar Default aber schreibs trozdem hin xD
//....
bilderListe.add(bild00);
bilderListe.add(bild01);
//...
Collections.shuffle(bilderListe);
//....run() 
public void setzeBild(){
temp = bilderListe.get(gezeigteBilder);
gezeigteBilder++;//So musst du nich löschen und Iterierst einfach die Bilder in der ArrayList durch
}
in beiden Fällen sollte einmal shuffle reichen:p
das ist nicht zwingend lauffähig aber sollst ja auch ein wenig Eigenarbeit reinstecken :p

so looong Vanny

//Edit:
TO: "ich dacht er würd mir das selbe Objekt geben, dass ich auch reingesteckt habe..??"

wenn du der Liste keinen Datentyp zuweist, dann bekommst du ein Object zurück und müsstest wohl Casten.
Java:
temp = (Pruefbild) bliderListe.get(0);
das wäre in diesem Fall aber nich schön:oops:
 
Zuletzt bearbeitet von einem Moderator:

fishhead

Mitglied
da wollt ich nen Edit machen um noch was hinzuzufügen, schon war aber ne antwort da ;) danke

okay..ich hats aber einfach so geacht, dass ich bei jedem TimerTask run() neu shuffle und dann immer am index 0 das objekt hole, weils ja dann sowieso immer ein anderes ist. removen wollte ich es nicht, da das ganze eine variable laufzeit haben soll und das bild auch mehrmals (wie der zufall es halt will) drankommen kann.

Gut dann probier ich das mal! :)

und wieder hab ich ein problemchen..ich weiß nicht, mit den formalen sachen hab ich glaub ich so meine probs.. ;)

Der User soll ja während das Bild gezeigt wird, also wöhrend dem run() die möglichkeit haben 0 oder 1 auf der tastatur zu drücken um das bild zu bewerten.(also obs true oder false ist).
Deshalb bin ich davon ausgegangen, dass sich bei jedem timertask aufruf die keyTyped() Funktion neu beschreiben muss. Habs mir so vorgestellt:
Java:
// ...timertask class
public void keyTyped (KeyEvent e) {
   if(e.getKeyCode() == KeyEvent.VK_0 && temp.getZustand() == false) {
       richtig++;
   }
   //und für die restlichen eingabe eben auch
´}

aber das kann ja nicht funktionieren, da innerhalb der run() erst die temp das aktuelle objekt holt usw.
Ebenso spinnt meine hauptklasse rum, an die ich ein "implements KeyListener" gehängt hab, dass ich die abstrakte Methode keyTyped nicht erstellt hab.
Original: "reaktionUI.reaktionUI is not abstract and does not override abstract method keyTyped(java.awt.event.KeyEvent)"
keyReleased und KeyPressed hab ich direkt inder Klasse reaktionUI definiert. keyTyped brauch ich aber ja jetzt in der Timertask class....??

Ehm, zwischendurch. ich habe implements KeyListener auf meine Hauptklasse angewendet, da diese von JFrame erbt und ich ja den KeyListener für den gesamten JFrame adden möchte.(Also egal was gerade in meinem Programm gefocused ist, er soll die eingabe dennoch wahrnehmen)

Schon wieder viel zu viel Text, als ich eigentlich vor hatte :D

Ich hoff ihr habt weiterhin die Muse mir zu helfen :)

Edit: Ah okay, wieder was gelernt :)
 
V

vanny

Gast
*hmpf* so mal eins nach dem anderen:autsch:

wenn das Bild doppelt kommen können soll, dann lass das mit dem shuffle :p

Zufall geht einfacher

Java:
Random r = new Random(); 
int index =	r.nextInt(bilderListe.size()-1);//gibt dir "zufällig" einen index für deine bilderListe wieder... 
temp = bilderListe.get(index);

so Nr2:
mit TimerTask meinst bestimmt nen eigenen Thread:D
Praktisch gesehen fallen mir spontan folgende Dinge auf:
- Bild-Darstellung und -Wechsel sollte der EDT übernehmen
- verhindern, das der User mehrfach drückt, bevor das Bild wechselt
- wie den Thread steuern?...

mach dir aber erstmal selbst Gedanken und zeig uns dein Schaffen :p
(nennt sich glaub ich Hilfe zur Selbsthilfe *duck*)

//Edit: kleiner Tipp - der KeyListener reicht im JFrame :p (viel Spass beim grübeln)

//NochEinEdit:
Ich hab dir mal ne kleine Übersicht gemacht, wie ich es in etwa strukturieren würde.
(blau gehört zum JFrame, orange wird von deinem TimerTask mitbenutzt).
Du wirst um Sysnchronisation wohl nicht herumkommen, also schau dir dieses Thema mal an.


so looong Vanny
 

Anhänge

  • reaktionUI.pdf
    53,4 KB · Aufrufe: 6
Zuletzt bearbeitet von einem Moderator:
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Zu bestimmte Stellen im code springen? Frameworks - Spring, Play, Blade, Vaadin & Co 8
Xentox501 Jump & Run: Beim springen bewegen(rechts,links) Frameworks - Spring, Play, Blade, Vaadin & Co 1
R Player springen lassen mit Gravity Frameworks - Spring, Play, Blade, Vaadin & Co 2
B Springen mit Collision Detection? Frameworks - Spring, Play, Blade, Vaadin & Co 15
it_is_all Springen zw. JPanels mit setVisible() Frameworks - Spring, Play, Blade, Vaadin & Co 4
C Suche Tutorial für - Spielfiguren springen lassen Frameworks - Spring, Play, Blade, Vaadin & Co 4
A Springen an Seitenanfang verhindern Frameworks - Spring, Play, Blade, Vaadin & Co 5
G Springen mithilfe von Trigonometrie Frameworks - Spring, Play, Blade, Vaadin & Co 4
J Spieler springen lassen Frameworks - Spring, Play, Blade, Vaadin & Co 24
Paul15 Nach vorne springen Frameworks - Spring, Play, Blade, Vaadin & Co 4
A RadioButtons springen nicht automatisch auf false Frameworks - Spring, Play, Blade, Vaadin & Co 3
S Von A nach B springen Frameworks - Spring, Play, Blade, Vaadin & Co 7
D Zum Code springen Frameworks - Spring, Play, Blade, Vaadin & Co 5
T DesktopPane mit GridLayout ohne, dass Fenster springen Frameworks - Spring, Play, Blade, Vaadin & Co 14
K von Button zu Zelle in Tabelle- zu anderer Zelle springen Frameworks - Spring, Play, Blade, Vaadin & Co 2
F.S.WhiTeY JSF: h:dataTable / p:DataGrid : Pagination und alphabetisch springen Frameworks - Spring, Play, Blade, Vaadin & Co 2
T OpenGL ES: Zoom und pan springen immer wieder zur Ausgangsposition zurück Frameworks - Spring, Play, Blade, Vaadin & Co 4
? In GZIPInputStream "springen" Frameworks - Spring, Play, Blade, Vaadin & Co 1
L \n , in die nächste Zeile springen Frameworks - Spring, Play, Blade, Vaadin & Co 11
M Zum Anfang eines Programmes springen Frameworks - Spring, Play, Blade, Vaadin & Co 2
S ...aus while schleife springen Frameworks - Spring, Play, Blade, Vaadin & Co 3
C Vom Case zur Case-Auswahl springen? Frameworks - Spring, Play, Blade, Vaadin & Co 9
R Txt Datei mit Notepad öffnen und zu bestimmter Zeile springen Frameworks - Spring, Play, Blade, Vaadin & Co 12
G Cursor Positionieren/mit Tabulator springen? Frameworks - Spring, Play, Blade, Vaadin & Co 8
F In NetBeans zum nächsten Fehler springen Frameworks - Spring, Play, Blade, Vaadin & Co 7
K Zu Fehler im Projekt springen Frameworks - Spring, Play, Blade, Vaadin & Co 2
K Per Tastaturbefehl zu nächstem Lesezeichen springen Frameworks - Spring, Play, Blade, Vaadin & Co 2
J Zur Auffälligkeit springen - Shortcut Frameworks - Spring, Play, Blade, Vaadin & Co 7
E JTable neue Zeile springen?! Frameworks - Spring, Play, Blade, Vaadin & Co 1
L Wenn Aufgaben erledigt sind, auf Programmanfang springen? Frameworks - Spring, Play, Blade, Vaadin & Co 12
J zu einer Zeile zürück springen Frameworks - Spring, Play, Blade, Vaadin & Co 9
R JEditorPane an bestimmte Stelle springen Frameworks - Spring, Play, Blade, Vaadin & Co 2
S Direkt zur Methode springen die in der Klasse und nicht im Interface implementiert? Frameworks - Spring, Play, Blade, Vaadin & Co 4

Ähnliche Java Themen

Neue Themen


Oben