Hallo zusammen,
ich habe folgenden Quelltext gerade fertiggestellt:
Hier soll für ein Hangman Spiel eine Liste mit Wörtern erstellt werden. Diese Liste soll beliebig erweiterbar sein.
Ich habe hierzu ein paar Fragen:
1. Frage:
Wenn die Liste z.B. 50 Einträge hat, dann passt sie nicht mehr in das JFrame. Ein Großteil der Wörter wird abgeschnitten.
Das müsste doch mit einem JScrollPanel änderbar sein?
Allerdings kann ich ein ScrollPanel nicht in das GridLayout einfügen.
Wisst ihr eine Möglichkeit, wie ich hier ein ScrollPanel einfügen kann?
2. Frage:
In der Klasse MeineWoerter gibt es folgende Catch - Anweisung:
Wisst ihr, wie ich statt "null" Eine Referenz zum JFrame herstelle?
Würde das hier mit einer Instanzvariablen vom Typ WortListe funktionieren?
Vielen Dank!
Viele Grüße!
ich habe folgenden Quelltext gerade fertiggestellt:
Java:
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.RandomAccessFile;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
public class WortListe extends JFrame {
//für die Anzahl der Wörter
private int anzahlWoerter;
//für die Eingabe neuer Wörter
private JTextField eingabeWoerter;
//für den Button einlesen und die Wortliste anzeigen
private JButton einlesen,anzeigen;
//eine Instanzvariable vom Typ RandomAccessFile
private RandomAccessFile datei;
//eine Instanzvariable vom Typ MeineWoerter
private MeineWoerter woerterTemp;
//das JLabel für die Anzahl der Wörter
private JLabel woerterAnzahlZeigen;
//eine innereKlasse für die Wörter
class MeineWoerter {
//die Wörter des Hang-Man Spiels
private String woerter;
MeineWoerter(String wort) {
//das neue Wort setzen
woerter = wort;
//den Index des neuen Wort setzen
datenSchreiben();
}
//die Methode für das Schreiben des Wortes in die Datei
private void datenSchreiben() {
try {
//eine neue Instanz für das Schreiben der Datei
datei = new RandomAccessFile("woerter.bin","rw");
//die Anzahl der Wörter erhöhen
//die Anzahl der Wörter steht zugleich für den
//Index des einzelnen Wortes
anzahlWoerter++;
//die Anzahl der Wörter wird in den ersten 4 Bytes
//als Int - Wert gespeichert
datei.writeInt(anzahlWoerter);
//den Zeiger ans Ende der Datei setzen
datei.seek(datei.length());
//jedes Wort erhält zuerst einen Index
//anschließend wird das Wort angehängt.
//den Index am Ende an die Datei anhängen
datei.writeInt(anzahlWoerter);
//das Wort nach dem Index an die Datei Anhängen
datei.writeUTF(woerter);
//datei wieder schließen.
datei.close();
}
catch(IOException e) {
/////////WIE REFERENZ zum ERZEUGEN??
JOptionPane.showMessageDialog(null,"Beim Schreiben ist ein Problem aufgetreten");
}
}
}
//eine innere Klasse für den ActionListener
class MeinListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
//das erstellt Wort speichern
if (e.getActionCommand().equals("lesen"))
werteEinlesen();
//die Liste der Wörter anzeigen
if (e.getActionCommand().equals("anzeigen"))
datenLesen();
}
}
public WortListe(String titel) {
//den Titel erstellen
super(titel);
//das Layout setzen
this.setLayout(new GridLayout(0,2));
//die Schaltfläche zum Einlesen der Dateien erstellen
einlesen = new JButton("Einlesen");
einlesen.setActionCommand("lesen");
//die Schaltfläche zum anzeigen der Wortliste erstellen
anzeigen = new JButton("Wörter anzeigen");
anzeigen.setActionCommand("anzeigen");
//die Schaltflächen mit dem Listener verbinden
MeinListener listener = new MeinListener();
einlesen.addActionListener(listener);
anzeigen.addActionListener(listener);
//ein Label für die Wörter erstellen
add(new JLabel("Wort eingeben: "));
//das Text Feld für die Wörter erstellen
eingabeWoerter = new JTextField();
//und einfügen
add(eingabeWoerter);
//ein Label für die eingegeben Wörter erstellen
add(new JLabel("Anzahl vorhanden Wörter: "));
//die Anzahl der Wörter welche bereits gespeichert wurden,
//ermitteln
try {
//eine neue Instanz für das Lesen der Datei
datei = new RandomAccessFile("woerter.bin","r");
//die Anzahl der Wörter ist in den ersten 4 Bytes gespeichert
anzahlWoerter = datei.readInt();
datei.close();
}
catch (IOException e) {
//falls die Datei noch nicht erstellt wurde, die Anzahl
//der Wörter auf 0 setzen.
anzahlWoerter = 0;
}
//die Anzahl der Wörter in einem JLabel anzeigen
add(woerterAnzahlZeigen = new JLabel(Integer.toString(anzahlWoerter)));
//den Button einlesen erstellen
add(einlesen);
//den Button anzeigen erstellen
add(anzeigen);
//das Fenster packen
pack();
//das Standardverhalten festlegen
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
//das Fenster anzeigen
setVisible(true);
}
private void werteEinlesen() {
//wenn kein Wort eingeben wurde, dann die Methode verlassen
if(eingabeWoerter.getText().isEmpty())
return;
//ein neues Wort erstellen
new MeineWoerter(eingabeWoerter.getText());
System.out.println("Die Anzahl der Wörter:" + anzahlWoerter);
//den Text des JLabels neu setzen
woerterAnzahlZeigen.setText(Integer.toString(anzahlWoerter));
}
private void datenLesen() {
try {
//eine neue Instanz für den Lesezugriff
datei = new RandomAccessFile("woerter.bin","r");
//den Zeiger auf das 4. Byte setzen, da erst am dem 5. Byte gelesen
//werden soll, weil in den Bytes 1 - 4 die Anzahl der Wörter im Typen Int
//abgespeichert wird
datei.seek(4);
//Mit der While-Schleife wird die Ausgabe gesteuert
//solange die aktuelle Position kleiner ist als die
//länge der Datei wird der Index ausgelesen
//und das Wort ausgegeben
while(datei.getFilePointer() < datei.length()) {
add(new JLabel(datei.readInt() + ". Wort: "));
add(new JLabel(datei.readUTF()));
//das Fenster neu packen
pack();
}
datei.close();
}
catch (IOException e) {
JOptionPane.showMessageDialog(this,"Beim Laden ist ein Problem aufgetreten");
}
}
//die MEthode zum zufälligen lesen der Datei
private void datenZufaelligLesen() {
//Variable für die zufällige Poition
double positionZufaellig;
//Variable für die neue Position
int neuePosition;
//die Zufällige Zahl ermitteln
positionZufaellig = Math.random() * anzahlWoerter+1;
System.out.println(positionZufaellig);
//Es existiert kein Wort mit einem Index < 1
//Falls eine zufällig Zahl < 1 berechnet wird,
//wird die Variable auf 1 gesetzt
if(positionZufaellig < 1)
positionZufaellig = 1;
try {
//eine neue Inszanz datei mit Lesezugriff
datei = new RandomAccessFile("woerter.bin","r");
//die Position auf die 4. Stelle setzen, da in den Bytes
//1 - 4 die anzahl der Wörter gespeichert wird
datei.seek(4);
//Es wird nach der Position gesucht
while(datei.getFilePointer() < datei.length()) {
//wenn der ausgelesene Int-WErt mit der
//zufällig ermittelten Position übereinstimmt
//dann String zurückliefern
if(datei.readInt() == (int) positionZufaellig) {
//return (datei.readUTF());
//return STRING
}
//wenn keine Übereinstimmung gefunden wurde, dann
//wird weitergesucht.
else {
neuePosition = datei.readUnsignedShort();
datei.seek(datei.getFilePointer() + neuePosition);
}
}
datei.close();
}
catch (IOException e) {
System.out.println("OH OH, FEHLLLER");
}
}
}
Hier soll für ein Hangman Spiel eine Liste mit Wörtern erstellt werden. Diese Liste soll beliebig erweiterbar sein.
Ich habe hierzu ein paar Fragen:
1. Frage:
Wenn die Liste z.B. 50 Einträge hat, dann passt sie nicht mehr in das JFrame. Ein Großteil der Wörter wird abgeschnitten.
Das müsste doch mit einem JScrollPanel änderbar sein?
Allerdings kann ich ein ScrollPanel nicht in das GridLayout einfügen.
Wisst ihr eine Möglichkeit, wie ich hier ein ScrollPanel einfügen kann?
2. Frage:
In der Klasse MeineWoerter gibt es folgende Catch - Anweisung:
Java:
catch(IOException e) {
/////////WIE REFERENZ zum ERZEUGEN??
JOptionPane.showMessageDialog(null,"Beim Schreiben ist ein Problem aufgetreten");
Wisst ihr, wie ich statt "null" Eine Referenz zum JFrame herstelle?
Würde das hier mit einer Instanzvariablen vom Typ WortListe funktionieren?
Vielen Dank!
Viele Grüße!
Zuletzt bearbeitet von einem Moderator: