import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
class Wrapper {
// Anfang Attribute
private String zEintrag;
// Ende Attribute
public Wrapper(String pEintrag) {
zEintrag=pEintrag;
}
// Anfang Methoden
public String getEintrag() {
return zEintrag;
}
// Ende Methoden
} // end of Wrapper
class List
{ private Node first, tail, current;
// Node
private class Node {
private Object contentObj;
private Node nextNode;
public Node(Object pContent) {
contentObj = pContent;
nextNode = null;
}
public void setContent(Object pContent) {
contentObj = pContent;
}
public Object content() {
return contentObj;
}
public void setNext(Node pNext) {
nextNode = pNext;
}
public Node getNext() {
return nextNode;
}
} // Ende der Klasse Node
/**
* Eine leere Liste wird erzeugt.
*/
public List() {
tail = new Node(null); // Dummy
first = tail;
tail.setNext(tail);
/* Der next-Zeiger des hinteren Dummy-Elementes
* zeigt auf das vorangehende Element.
*/
current=first;
}
/**
* Die Anfrage liefert den Wert true, wenn die Liste
* keine Objekte enthaelt, sonst liefert sie den Wert false.
* @return true, wenn die Liste leer ist, sonst false
*/
public boolean isEmpty() {
return first == tail;
}
/**
* Die Anfrage liefert den Wert true, wenn es ein
* aktuelles Objekt gibt, sonst
* liefert sie den Wert false.
* @return true, falls Zugriff moeglich, sonst false
*/
public boolean hasAccess() {
return (!this.isEmpty()) && (current != tail);
}
/**
* Falls die Liste nicht leer ist, es ein aktuelles
* Objekt gibt und dieses nicht das letzte Objekt der
* Liste ist, wird das dem aktuellen Objekt in der Liste
* folgende Objekt zum aktuellen Objekt, andernfalls gibt
* es nach Ausführung des Auftrags kein aktuelles Objekt,
* d.h. hasAccess() liefert den Wert false.
*/
public void next() {
if (this.hasAccess())
current = current.getNext();
}
/**
* Falls die Liste nicht leer ist, wird das erste
* Objekt der Liste aktuelles Objekt.
* Ist die Liste leer, geschieht nichts.
*/
public void toFirst() {
if (!this.isEmpty())
current = first;
}
/**
* Falls die Liste nicht leer ist, wird das
* letzte Objekt der Liste aktuelles Objekt.
* Ist die Liste leer, geschieht nichts.
*/
public void toLast() {
if (!this.isEmpty())
current = tail.getNext();
}
/**
* Falls es ein aktuelles Objekt gibt
* (hasAccess() == true), wird das aktuelle Objekt
* zurueckgegeben, andernfalls (hasAccess()== false)
* gibt die Anfrage den Wert null zurueck.
* @return Inhaltsobjekt
*/
public Object getObject() {
if (this.hasAccess())
return current.content();
else
return null;
}
/**
* Falls es ein aktuelles Objekt gibt (hasAccess() == true)
* und pObject ungleich null ist, wird das aktuelle Objekt
* durch pObject ersetzt. Sonst bleibt die Liste unveraendert.
* @param pObject Inhaltsobjekt
*/
public void setObject(Object pObject) {
if (pObject != null && this.hasAccess() )
current.setContent(pObject);
}
/**
* Ein neues Objekt pObject wird am Ende der Liste eingefuegt.
* Das aktuelle Objekt bleibt unveraendert. Wenn die Liste
* leer ist, wird das Objekt pObject in die Liste eingefuegt
* und es gibt weiterhin kein aktuelles Objekt
* (hasAccess() == false). Falls pObject gleich null ist,
* bleibt die Liste unveraendert.
*@param pObject Inhaltsobject
*/
public void append(Object pObject) {
if (pObject != null) {
Node lNewNode,lPos0;
lPos0 = current;
lNewNode = new Node(pObject);
lNewNode.setNext(tail);
if (this.isEmpty())
first = lNewNode;
else {
Node lPrevious = tail.getNext();
lPrevious.setNext(lNewNode);
}
tail.setNext(lNewNode);
current = lPos0;
}
}
/**
*Falls es ein aktuelles Objekt gibt (hasAccess() == true),
*wird ein neues Objekt vor dem aktuellen Objekt in die
*Liste eingefuegt. Das aktuelle Objekt bleibt unveraendert.
*Wenn die Liste leer ist, wird pObject in die Liste eingefuegt
*und es gibt weiterhin kein aktuelles Objekt
*(hasAccess() == false). Falls es kein aktuelles Objekt gibt
*(hasAccess() == false) und die Liste nicht leer ist oder
*pObject gleich null ist, bleibt die Liste unveraendert.
*@param pObject Inhaltsobjekt
*/
public void insert(Object pObject) {
if (pObject != null) {
Node lNewNode,lFront,lPos;
if (this.isEmpty())
this.append(pObject);
else
if (this.hasAccess() ) {
lPos = current;
lNewNode = new Node(pObject);
lNewNode.setNext(current);
if (lPos == first )
first = lNewNode;
else {
this.toFirst();
lFront = current;
while (this.hasAccess() & !(current == lPos)) {
lFront = current;
this.next();
}
lFront.setNext(lNewNode);
}
current=lPos;
}
}
}
/**
* Die Liste pList wird an die Liste angehaengt. Anschliessend
* wird pList eine leere Liste. Das aktuelle Objekt bleibt unveraendert.
* Falls pList null oder eine leere Liste ist, bleibt die Liste
* unveraendert.
* @param pList Liste
*/
public void concat(List pList) {
Node lCurrent1,lCurrent2,lPos0;
if (pList != null && !pList.isEmpty() ) {
if (this.isEmpty() ) {
first = pList.first;
tail = pList.tail;
current = tail;
}
else {
lPos0 = current;
current = tail.getNext();
lCurrent1 = current;
pList.toFirst();
current = pList.current;
lCurrent2 = pList.current;
lCurrent1.setNext(lCurrent2);
if (lPos0 != tail)
current = lPos0;
else
current = pList.tail;
tail = pList.tail;
// pList wird zur leeren Liste
pList.tail = new Node(null); // Dummy
pList.first = pList.tail;
pList.tail.setNext(tail);
pList.current = pList.tail;
}
}
}
/**
* Falls es ein aktuelles Objekt gibt (hasAccess() == true),
* wird das aktuelle Objekt geloescht und das Objekt hinter
* dem gelaeschten Objekt wird zum aktuellen Objekt. Wird das
* Objekt, das am Ende der Liste steht, geloescht, gibt es kein
* aktuelles Objekt mehr (hasAccess() == false). Wenn die Liste
* leer ist oder es kein aktuelles Objekt gibt (hasAccess() == false),
* bleibt die Liste unveraendert.
*/
public void remove() {
Node lPos, lFront;
if (this.hasAccess() ) {
if (current == first ) {
first = current.getNext();
if (current.getNext() == tail)
tail.setNext(first);
current = first;
}
else {
lPos = current;
this.toFirst();
lFront = current;
while (this.hasAccess() & !(current == lPos)) {
lFront = current;
this.next();
}
lFront.setNext(lPos.getNext());
current = lFront.getNext();
if (current == tail)
tail.setNext(lFront);
}
}
}
}
public class Start extends JFrame {
// Anfang Attribute
private JTextField tfEingabe = new JTextField();
private JButton bEintragen = new JButton();
private JButton bAusgeben = new JButton();
private JTextArea taAusgabe = new JTextArea("");
private JScrollPane taAusgabeScrollPane = new JScrollPane(taAusgabe);
public List hListe;
String job;
private JTextField tfjob = new JTextField();
private JLabel lName = new JLabel();
private JLabel lJob = new JLabel();
// Ende Attribute
public Start(String title) {
// Frame-Initialisierung
super(title);
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
int frameWidth = 287;
int frameHeight = 335;
setSize(frameWidth, frameHeight);
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
int x = (d.width - getSize().width) / 2;
int y = (d.height - getSize().height) / 2;
setLocation(x, y);
setResizable(false);
Container cp = getContentPane();
cp.setLayout(null);
// Anfang Komponenten
tfEingabe.setBounds(56, 24, 105, 25);
cp.add(tfEingabe);
bEintragen.setBounds(168, 24, 81, 25);
bEintragen.setText("eintragen");
bEintragen.setMargin(new Insets(2, 2, 2, 2));
bEintragen.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
bEintragen_ActionPerformed(evt);
}
});
cp.add(bEintragen);
bAusgeben.setBounds(168, 56, 81, 25);
bAusgeben.setText("ausgeben");
bAusgeben.setMargin(new Insets(2, 2, 2, 2));
bAusgeben.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
bAusgeben_ActionPerformed(evt);
}
});
cp.add(bAusgeben);
taAusgabeScrollPane.setBounds(24, 88, 225, 161);
cp.add(taAusgabeScrollPane);
tfjob.setBounds(56, 56, 105, 25);
cp.add(tfjob);
lName.setBounds(11, 21, 38, 20);
lName.setText("Name:");
cp.add(lName);
lJob.setBounds(22, 54, 30, 20);
lJob.setText("Job:");
cp.add(lJob);
// Ende Komponenten
setVisible(true);
hListe = new List();
} // end of public Start
// Anfang Methoden
public void bEintragen_ActionPerformed(ActionEvent evt) {
String S = tfEingabe.getText();
job = tfjob.getText();
Wrapper E = new Wrapper(S);
hListe.append(E);
tfEingabe.setText("");
} // end of bEintragen_ActionPerformed
public void bAusgeben_ActionPerformed(ActionEvent evt) {
taAusgabe.setText("");
hListe.toFirst();
while (hListe.hasAccess()) {
Wrapper E=(Wrapper) hListe.getObject();
String S = E.getEintrag();
taAusgabe.append(S+"\n");
hListe.next();
String job = E.getEintrag();
taAusgabe.append(E+"\n");
hListe.next();
}
} // end of bAusgeben_ActionPerformed
// Ende Methoden
public static void main(String[] args) {
new Start("Start");
} // end of main
} // end of class Start