Informatik-Elemente graphischer Oberflächen: Unterschied zwischen den Versionen

Aus RSG-Wiki
Wechseln zu: Navigation, Suche
Zeile 140: Zeile 140:
 
Schreibe eine Methode schreibeErgebnis(), die in Abhängigkeit vomSpielwert einen geeigneten Kommentar in dem JLabel-Objekt ausgibt.<br>  
 
Schreibe eine Methode schreibeErgebnis(), die in Abhängigkeit vomSpielwert einen geeigneten Kommentar in dem JLabel-Objekt ausgibt.<br>  
 
Hinweis: Das JLabel-Objekt besitzt die Methode setText(String text), die den übergebenen Wert anzeigt. Rufe die neue Methode in spiele() auf.
 
Hinweis: Das JLabel-Objekt besitzt die Methode setText(String text), die den übergebenen Wert anzeigt. Rufe die neue Methode in spiele() auf.
 +
}}
 +
 +
{{Lösung versteckt|1=Die Einträge bei den Attributen haben wir schon gemacht. <br>
 +
Bei den Attributen: <br>
 +
<span style="color: #0033FF">private JLabel anzeige;</span><br>
 +
Im Konsturktor müssen wir jetzt die Anzeige erzeugen:<br>
 +
Im Konstruktor:<br>
 +
<span style="color: #0033FF">anzeige = new JLabel(" ");<br>
 +
ZEICHENFENSTER.gibFenster().komponenteHinzufuegen(anzeige, "unten");</span><br>
 +
Dieses Feld ruft keine Methode auf, daher brauchen wir keinen ActionListener()!
 +
 +
In der Methode spiele() fügt man die Methode schreibeErgebnis() ein:<br>
 +
<span style="color: #0033FF">schreibeErgebnis();</span><br> 
 +
Nun muss man noch die Methode schreibeErgebnis() formulieren.<br>
 +
<span style="color: #0033FF">public void schreibeErgebnis()<br>
 +
{<br>
 +
if (ermittleGewinn() == 10){anzeige.setText(" Hauptgewinn!!  10 €");  }<br>
 +
else { if (ermittleGewinn() == 2) {anzeige.setText(" Kleiner Gewinn  2 €");  }<br>
 +
else { anzeige.setText("  Verloren!!");}        <br>
 +
}<br>
 +
}</span>
 
}}
 
}}

Version vom 2. Mai 2020, 10:57 Uhr

Mit Feldern konnten wir statistische Daten erheben und Auswertungen machen. Für einen Spielautomaten fehlen uns aber noch der Startknopf und die Gewinnanzeige. Dies wollen wir jetzt angehen.

Um den Spielautomat nun funktionsfähig zu gestalten benötigen wir noch eine Schaltfläche  Neues Spiel und eine Anzeige Gewinn in der unteren Steuerungsleiste.

Automat1.jpg

Wir müssen also eine Schaltfläche und eine Anzeige unserem Spielautomat hinzufügen. Dazu benötigen wir Klassen, auf die wir zugreifen müssen. Die benötigten Klassen befinden sich weitgehend im Paket javax.swing. Damit wir darauf zugreifen können, müssen wir das Paket importieren. Das haben wir schon bei den Zufallszahlen gehabt. Da mussten wir auch das Paket java.util.Random importieren. Daher muss das Paket javax.swing auch vor der Klassenvereinbarung importiert werden. Also schreibt man in die nächste Zeile nach
import java.util.Random;
den Import
import javax.swing.*;

* bedeutet, dass man das gesamte Paket zur Verfügung hat und nicht nur spezielle Dinge daraus.

Unsere Klasse schaut nun folgendermaßen aus:

import java.util.Random;
import javax.swing.*;

public class SPIELAUTOMAT
{//weiterer Quelltext}


Bleistift 35fach.jpg   Aufgabe 1

Was steht im Quelltext der Klasse SPIELAUTOMAT ?

Im Quelltext stehen
1. die Attribute der Klasse,
2. der Konstruktor und

3. die Methoden der Klasse.


Nuvola apps kig.png   Merke

Graphische Oberflächen sind aus Komponenten wie Schaltknopf, Textanzeige, Texteingabe oder Auswahlliste aufgebaut. Alle diese Komponenten werden in ein Graphikfenster eingefügt. Auch das Graphikfenster selbst ist eine graphische Komponente.

Die Objekte der Klasse ZEICHENFENSTER haben eine Methode komponenteHinzufuegen(JComponent element, String position), die das übergebene Objekt in die Steuerungsleiste rechts oder unten einfügt.


Als erstes haben wir das Paket für graphische Oberflächen importiert. Nun müssen wir bei den Attributen ein Attribut der gewünschen Klasse einführen.
Ein Attribut der gewünschten Klasse ist z. B. JButton für einen Schaltknopf oder JLabel für eine Textanzeige. Wir führen aus der Klasse JButton einen Schaltknopf ein und nennen ihn schaltknopf und aus der Klasse JLabel führen wir eine Anzeige ein und nennen sie anzeige.
Im Quelltext der Klasse SPIELAUTOMAT steht dann:
import javax.swing.*;
public class SPIELAUTOMAT
{
private JButton schaltknopf;
private JLabel anzeige;
//weiterer Quelltext
}


Bleistift 35fach.jpg   Aufgabe 2

Was bewirken die Zeilen
private JButton schaltknopf;
private JLabel anzeige;
bei den Attributen?

private JButton schaltknopf; ruft ein Attribut der Klasse JButton auf, das in der Klassen SPIELAUTOMAT den Name schaltknopf erhält und private JLabel anzeige; ruft ein Atribut der Klasse JLabel auf, das hier den Name anzeige erhält.


Als nächstes muss man nun di Objekte erzeugen.


Bleistift 35fach.jpg   Aufgabe 3

Wo werden im Java-Quelltext Objekte erzeugt?

Im Konstruktor werden Objekte erzeugt.


Nuvola apps kig.png   Merke

Man erzeugt als nächstes das Objekt eines Schaltknopfs im Konstruktor des Spielautomaten:

public SPIELAUTOMAT()
{
schaltknopf = new JButton("Neues Spiel");
...}

Dieses erzeuge Objekt muss nun in das Graphikfenster eingebaut werden. Dies erfolgt nachdem man den Schaltknopf erzeugt hat ebenfalls im Konstruktor.

public SPIELAUTOMAT()
{
schaltknopf = new JButton("Neues Spiel");
ZEICHENFENSTER.gibFenster().komponenteHinzufuegen(schaltknopf, „unten“);
...}


Bleistift 35fach.jpg   Aufgabe 4

Was bewirken im Konstruktor die Zeilen:
schaltknopf = new JButton("Neues Spiel");
ZEICHENFENSTER.gibFenster().komponenteHinzufuegen(schaltknopf, „unten“); ?

schaltknopf = new JButton("Neues Spiel"); erzeugt einen Schaltknopf auf dem "Neues Spiel" angezeigt wird.

ZEICHENFENSTER.gibFenster().komponenteHinzufuegen(schaltknopf, „unten“); fügt den Schaltknopf im Graphikfesnter unten an.


Hierbei gibt es noch einige zu beachten:

Nuvola apps kig.png   Merke

Dem Schaltknopf muss ein Objekt vom Typ ActionListener zugeordnet werden. Dieses wird benachrichtigt, wenn der Schaltknopf betätigt wird und ruft dann seine Methode actionPerformed() auf.

Ein ActionListener-Element wird beim Aufruf der Methode addActionListener() mit new ActionListener() erzeugt.

Es wird ein Objekt einer anonymen Unterklasse von ActionListener erzeugt, deren Methode actionPerformed() an die konkrete Situation angepasst wird. Die Methode actionPerformed() wird so implementiert, dass sie die Methode spiele() aufruft.


Im Java-Quelltext schaut das nun folgendermaßen aus, dass man im Konstruktor nachdem man den Schaltknopf erzeugt hat und im Graphigkfenster unten angezeigt hat nun ein Objekt vom Typ ActioListener erzeugt:

schaltknopf.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
spiele();}
}
);

Dadurch wird im ActionListener die Methode actionPerfomed() aufgerufen,die wiederum die Methode spiele() aufruft.

Nuvola apps kig.png   Merke

Damit der ActionListener funktioniert muss zu Beginn der Klasse noch import java.awt.event.*; eingefügt werden.

Schaltflächen wie JButton erzeugen bei Benutzung, wie viele andere Komponenten auch, sog. events (Ereignisse). Je nach Komponente werden unterschiedliche Ereignisse ausgesandt. Bei Schaltflächen ist dies ein ActionEvent.
Da man normalerweise nicht an allen ausgesandten Ereignissen interessiert ist, muss man diejenigen, auf die man reagieren möchte abfangen. Hierzu steht für jedes spezielle Ereignis der ActionListener zur Verfügung, bei dem man die das Ereignis erzeugende Komponente anmelden muss.


Bleistift 35fach.jpg   Aufgabe 5

Erweitere den Quelltext der Klasse SPIELAUTOMAT durch Hinzufügen eines Schaltknopfes der den Namen schaltknopf. Mache die nötigen Einträge bei den Attributen und im Konstruktor

Vor der Klassenvereinbarung steht nun:

import java.util.Random; 
import javax.swing.*;
import java.awt.event.*;

Dann kommt die Definition der Klasse:

public class SPIELAUTOMAT 

Bei den Attributen wird hinzugefügt:

private JButton schaltknopf;

Im Konstruktor wird hinzugefügt:

schaltknopf = new JButton("Neues Spiel");
ZEICHENFENSTER.gibFenster().komponenteHinzufuegen(schaltknopf, "unten");
schaltknopf.addActionListener(new ActionListener()
{ 
         public void actionPerformed(ActionEvent e)
         {
              spiele();   
         }
 }            
 );

Achtet auch auf die letze geschweifte Klammer mit ;  !

Zusammengehörige Klammern sind farbig!


Bleistift 35fach.jpg   Aufgabe 6

Das Spielergebnis soll in einem Ausgabefeld der Klasse JLABEL angezeigt werden. Füge eine passende Komponente in das Graphikfenster ein. Verwende den Konstruktor ohne Parameter. Dem JLabel-Objekt wird im Gegensatz zum JButton-Objekt keine Methode zugeordnet, da es ja nicht auf externe Eingaben reagieren muss.

Schreibe eine Methode schreibeErgebnis(), die in Abhängigkeit vomSpielwert einen geeigneten Kommentar in dem JLabel-Objekt ausgibt.
Hinweis: Das JLabel-Objekt besitzt die Methode setText(String text), die den übergebenen Wert anzeigt. Rufe die neue Methode in spiele() auf.

Die Einträge bei den Attributen haben wir schon gemacht.
Bei den Attributen:
private JLabel anzeige;
Im Konsturktor müssen wir jetzt die Anzeige erzeugen:
Im Konstruktor:
anzeige = new JLabel(" ");
ZEICHENFENSTER.gibFenster().komponenteHinzufuegen(anzeige, "unten");

Dieses Feld ruft keine Methode auf, daher brauchen wir keinen ActionListener()!

In der Methode spiele() fügt man die Methode schreibeErgebnis() ein:
schreibeErgebnis();
Nun muss man noch die Methode schreibeErgebnis() formulieren.
public void schreibeErgebnis()
{
if (ermittleGewinn() == 10){anzeige.setText(" Hauptgewinn!! 10 €"); }
else { if (ermittleGewinn() == 2) {anzeige.setText(" Kleiner Gewinn 2 €"); }
else { anzeige.setText(" Verloren!!");}
}

}