J
TFH-Berlin, 2 Sem. medieninformatik bei Solymosi?
Haben wir gerade als Übung gehabt:
package liste;
class Knoten<Element> {
public Element wert = null;
public Knoten<Element> verbindung = null;
public Knoten (final Element wert, final Knoten<Element> verbindung){
this.wert = wert;
this.verbindung = verbindung;
}
}
package liste;
import lehrbuch.*;
class ListRing<Element> implements WarteschlangeImpl<Element>{
private Knoten<Element> anker = null;
private final NoMoreMemoryException outOfMemory = new NoMoreMemoryException("OutOfMemoryError");
private class NoMoreMemoryException extends VollAusnahme{
private String info;
public NoMoreMemoryException(String info){
super();
this.info = info;
}
public String toString(){
return info;
}
}
public void entleeren(){
anker = null;
}
public void eintragen(final Element element) throws VollAusnahme{
try{
Knoten<Element> last = anker;
//wenn anker ==null: Exception
anker = new Knoten<Element>(element, last.verbindung);
last.verbindung = anker;
}catch(OutOfMemoryError ausnahme){
//throw new VollAusnahme(); //Neues Objekt ohne Memory ?! Na dann viel Glück ...
throw outOfMemory;
}
//Alternativ hätte man mit if(!istLeer)/else arbeiten können
catch(NullPointerException e){
anker = new Knoten<Element>(element,anker);
anker.verbindung = anker;
}
}
public Element lesen() throws LeerAusnahme{
try{
return anker.verbindung.wert;
}
catch(NullPointerException e){
throw new LeerAusnahme();
}
}
public void entfernen() throws LeerAusnahme{
if(istLeer()) throw new LeerAusnahme(); //eleganter
//prüft, wieviele Objekte in der Liste hängen ## bei nur 1Obj: Referenz auf sich selbst
if(anker.verbindung.verbindung != anker.verbindung)
anker.verbindung = anker.verbindung.verbindung;
//wenn Referenz auf sich selbst
else anker = null;
}
public boolean istLeer(){
return anker == null;
}
public boolean istVoll(){
return false;
}
}
package liste;
import lehrbuch.*;
public interface WarteschlangeImpl<Element> {
public void entleeren(); // ensures istLeer()
public void eintragen(final Element element) throws VollAusnahme; // requires !istVoll() // ensures !istLeer()
public Element lesen() throws LeerAusnahme; // const // requires !istLeer()
public void entfernen() throws LeerAusnahme; // requires !istLeer() // ensures !istVoll()
public boolean istLeer(); // const
public boolean istVoll(); // const
}
package liste;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import lehrbuch.*;
class WarteschlangeGUI
{
private ListRing listInstanz;
private JFrame frame;
private Container content;
//######### Konstruktor ##########
public WarteschlangeGUI()
{
listInstanz = new ListRing();
//Frame erstellen
frame = new JFrame();
frame.setLayout(null);
content = frame.getContentPane();
frame.setSize(350,250);
//TextField zur Eingabe erstellen
JTextField eingabeFeld = new JTextField("Text eingeben");
eingabeFeld.setBounds(10,72,100,20);
//StatusLabel erstellen
JLabel status = new JLabel("Status:");
status.setBounds(10,200,240,20);
//Listener für Buttons
KomponentenLauscher lauscher = new KomponentenLauscher(status,eingabeFeld);
//Buttons erstellen
JButton eintragen = new JButton("eintragen");
eintragen.setBounds(10,10,100,20);
eintragen.addActionListener(lauscher);
JButton entfernen = new JButton("entfernen");
entfernen.setBounds(120,10,100,20);
entfernen.addActionListener(lauscher);
JButton entleeren = new JButton("entleeren");
entleeren.setBounds(10,40,100,20);
entleeren.addActionListener(lauscher);
JButton lesen = new JButton("lesen");
lesen.setBounds(120,40,100,20);
lesen.addActionListener(lauscher);
//Komponenten hinzufügen
content.add(eintragen);
content.add(entfernen);
content.add(entleeren);
content.add(lesen);
content.add(eingabeFeld);
content.add(status);
frame.setVisible(true);
}
public static void main(String [] args) {
WarteschlangeGUI instanzGUI = new WarteschlangeGUI();
}
//############### ACTION ##########
class KomponentenLauscher implements ActionListener
{
JLabel status;
JTextField eingabeFeld;
public KomponentenLauscher(JLabel status, JTextField eingabeFeld){
this.status = status;
this.eingabeFeld = eingabeFeld;
}
public void actionPerformed(ActionEvent e)
{
if (e.getActionCommand() == "eintragen"){
try{
listInstanz.eintragen(eingabeFeld.getText());
status.setText("<html>String-Objekt <font color=\"RED\"><i>'"+eingabeFeld.getText()+"'</i></font> hinzugefügt</html>");
}
catch(VollAusnahme voll){
status.setText("<html>Ausnahme - Warteschlange <font color=\"RED\">voll</font></html>");
}
}
if (e.getActionCommand() == "entfernen"){
try{
listInstanz.entfernen();
status.setText("<html>Ältestes String-Objekt entfernt!");
}
catch(LeerAusnahme leer){
status.setText("<html>Ausnahme - Warteschlange <font color=\"RED\">leer</font></html>");
}
}
if (e.getActionCommand() == "entleeren"){
listInstanz.entleeren();
status.setText("entleert");
}
if (e.getActionCommand() == "lesen"){
try{
status.setText("<html>Ältestes-Objekt <font color=\"RED\"><i>'"+listInstanz.lesen().toString()+"'</i></font></html>");
}
catch(LeerAusnahme leer){
status.setText("<html>Ausnahme - Warteschlange <font color=\"RED\">leer</font></html>");
}
}
}
}
}