# Aus einem Applet grafische Fenster bzw. Dialoge öffnen



## Sinnlos (10. Jun 2004)

Hallo, hat jemand eine ahnung wie man Fenster in einen applet öffnet ? 
versteh diese " _irgendwas " befehlt nicht so recht.

 :roll:


----------



## Illuvatar (10. Jun 2004)

Sinnlos hat gesagt.:
			
		

> Hallo, hat jemand eine ahnung wie man Fenster in einen applet öffnet ?


Ja, nicht anders als in einer Applikation  
Window#setVisible oder Window#show, wobei letzteres deprecated ist/wird.



			
				Sinnlos hat gesagt.:
			
		

> ]versteh diese " _irgendwas " befehlt nicht so recht.


Und ich dich nicht. ???:L


----------



## Sinnlos (10. Jun 2004)

also folgendes problem:
da das bei _factory .. was macht das script da ? 



```
if(Translator.getMessage("label.about").equals(s))
        {
            _factory.createAboutDialog();
            return;
        }
```


----------



## Illuvatar (10. Jun 2004)

Das ist kein Script, nebenbei bemerkt.
Ich vermute mal, da wird die Methode createAboutDialog auf dem Objekt _factory aufgerufen. Diese erstellt wahrscheinlich einen Dialog, wie der Name so schön sagt.
Mehr kann ich mit dem Codeschnipsel nicht sagen.

Edit: Lies vielleicht erst mal ein Javabuch, da gibt ein paar gute in der Bücher&Tutorials-Sektion


----------



## Sinnlos (10. Jun 2004)

mhhh wie bekomm ich denn eine class datei  auf ... also mit welchen befehlen ?


----------



## L-ectron-X (10. Jun 2004)

Also langsam wird es Zeit, dass Du etwas konkreter wirst und Dir bei Deinen Postings mehr Mühe bei der Formulierung gibst! Wir sind hier keine Hellseher. :noe:
Eine Class-Datei kann man nicht mit einem Befehl öffnen/editieren, man muss sie dekompilieren.

Du kannst einen Dialog aus einem Applet heraus öffnen, wenn Du eine Instanz davon erzeugst. Dazu kannst Du eine Klasse schreiben (auch eine innere Klasse), die von einem Dialog abgeleitet ist. Bei einem Applet bietet sich da der java.awt.Dialog an.


----------



## Sinnlos (10. Jun 2004)

also ich möcht in folgenden code :



```
package com.lyrisoft.chat.client.gui.awt102;

import com.lyrisoft.chat.Translator;
import com.lyrisoft.chat.client.gui.*;
import com.lyrisoft.chat.server.local.IChatServer;
import java.awt.*;

// Referenced classes of package com.lyrisoft.chat.client.gui.awt102:
//            ChatPanel, EnhancedChatPanel

public class ChatRoom extends Frame
    implements IChatRoom
{

    public ChatRoom(String s, IChatGUIFactory ichatguifactory, ChatGUI chatgui, IChatClientInputReceiver ichatclientinputreceiver, IChatServer ichatserver)
    {
        this(s, s, ichatguifactory, chatgui, ichatclientinputreceiver, ichatserver);
    }

    public ChatRoom(String s, String s1, IChatGUIFactory ichatguifactory, ChatGUI chatgui, IChatClientInputReceiver ichatclientinputreceiver, IChatServer ichatserver)
    {
        miButtonsOn = new CheckboxMenuItem(Translator.getMessage("label.on"));
        miButtonsOff = new CheckboxMenuItem(Translator.getMessage("label.off"));
        _factory = ichatguifactory;
        _server = ichatserver;
        setTitle(s1);
        _mainGUI = chatgui;
        _room = s;
        resize(600, 400);
        _chatPanel = createPanel(ichatguifactory, s, s1, ichatclientinputreceiver);
        setLayout(new GridLayout(1, 1));
        add(_chatPanel);
        setMenuBar(createMenuBar());
    }

    public boolean action(Event event, Object obj)
    {
        if(event.target instanceof MenuItem)
        {
            handleMenuEvent(event, obj);
            return true;
        } else
        {
            return super.action(event, obj);
        }
    }

    void checkboxSelect(CheckboxMenuItem acheckboxmenuitem[], String s)
    {
        for(int i = 0; i < acheckboxmenuitem.length; i++)
            if(!acheckboxmenuitem[i].getLabel().equals(s))
                acheckboxmenuitem[i].setState(false);
            else
                acheckboxmenuitem[i].setState(true);

    }

    protected Menu createFontMenu()
    {
        fontSizeMenu = new Menu(Translator.getMessage("label.size"));
        fontSizeMenuItems = new CheckboxMenuItem[18];
        for(int i = 6; i < 24; i++)
        {
            CheckboxMenuItem checkboxmenuitem = new CheckboxMenuItem(String.valueOf(i));
            fontSizeMenu.add(checkboxmenuitem);
            if(i == 15)
                checkboxmenuitem.setState(true);
            fontSizeMenuItems[i - 6] = checkboxmenuitem;
        }

        fontStyleMenu = new Menu(Translator.getMessage("label.style"));
        String as[] = Toolkit.getDefaultToolkit().getFontList();
        fontStyleMenuItems = new CheckboxMenuItem[as.length];
        for(int j = 0; j < as.length; j++)
        {
            CheckboxMenuItem checkboxmenuitem1 = new CheckboxMenuItem(as[j]);
            fontStyleMenu.add(checkboxmenuitem1);
            if("Dialog".equalsIgnoreCase(as[j]))
                checkboxmenuitem1.setState(true);
            fontStyleMenuItems[j] = checkboxmenuitem1;
        }

        Menu menu = new Menu(Translator.getMessage("label.font"));
        menu.add(fontSizeMenu);
        menu.add(fontStyleMenu);
        return menu;
    }

    protected MenuBar createMenuBar()
    {
        MenuBar menubar = new MenuBar();
        fileMenu = new Menu(Translator.getMessage("label.file"));
        fileMenu.add(new MenuItem(Translator.getMessage("label.close")));
        menubar.add(fileMenu);
        Menu menu = createFontMenu();
        menubar.add(menu);
        menu = _chatPanel.createActionMenu();
        menubar.add(menu);
        menu = createOptionsMenu();
        menubar.add(menu);
        helpMenu = new Menu(Translator.getMessage("label.help"));
        helpMenu.add(new MenuItem(Translator.getMessage("label.about")));
		helpMenu.add(new MenuItem(Translator.getMessage("label.hilfe")));
        menubar.setHelpMenu(helpMenu);
        return menubar;
    }

    protected Menu createOptionsMenu()
    {
        Menu menu = new Menu(Translator.getMessage("label.buttonbar"));
        menu.add(miButtonsOn);
        miButtonsOn.setState(true);
        menu.add(miButtonsOff);
        Menu menu1 = new Menu(Translator.getMessage("label.options"));
        menu1.add(menu);
        return menu1;
    }

    protected EnhancedChatPanel createPanel(IChatGUIFactory ichatguifactory, String s, String s1, IChatClientInputReceiver ichatclientinputreceiver)
    {
        return new EnhancedChatPanel(ichatguifactory, s, s1, ichatclientinputreceiver);
    }

    public void displayError(String s)
    {
        _chatPanel.displayError(s);
    }

    public void displayMessage(String s)
    {
        _chatPanel.displayMessage(s);
    }

    public void displayMessage(String s, String s1)
    {
        _chatPanel.displayMessage(s, s1);
    }

    public void displayPrivateEmote(String s, String s1)
    {
        _chatPanel.displayPrivateEmote(s, s1);
    }

    public void displayPrivateMessage(String s, String s1)
    {
        _chatPanel.displayPrivateMessage(s, s1);
    }

    public String getName()
    {
        return _room;
    }

    public boolean handleEvent(Event event)
    {
        if(event.target == this && event.id == 201)
            _server.partRoom(_room);
        else
        if(event.id == 1004)
            _mainGUI.setStatusGui(this);
        return super.handleEvent(event);
    }

    public void handleMenuEvent(Event event, Object obj)
    {
        if(obj == null)
            return;
        String s = obj.toString();
        if(Translator.getMessage("label.close").equals(s))
        {
            _server.partRoom(_room);
            return;
        }
        if(Translator.getMessage("label.about").equals(s))
        {
            _factory.createAboutDialog();
            return;
        }
        
		if(Translator.getMessage("label.hilfe").equals(s))
		{
			_factory.getClass("Profil");
			return;
		}
        
        if(event.target == miButtonsOn)
        {
            _chatPanel.showBigButtons(true);
            miButtonsOn.setState(true);
            miButtonsOff.setState(false);
            return;
        }
        if(event.target == miButtonsOff)
        {
            _chatPanel.showBigButtons(false);
            miButtonsOn.setState(false);
            miButtonsOff.setState(true);
            return;
        }
        if(event.target instanceof CheckboxMenuItem)
        {
            s = ((CheckboxMenuItem)event.target).getLabel();
            String s1;
            try
            {
                int i = Integer.parseInt(s);
                setFontSize(i);
                checkboxSelect(fontSizeMenuItems, s);
                return;
            }
            catch(NumberFormatException _ex)
            {
                s1 = s;
            }
            setFont(s);
            checkboxSelect(fontStyleMenuItems, s);
            return;
        } else
        {
            _chatPanel.action(event, s);
            return;
        }
    }

    public void setFont(String s)
    {
        _chatPanel.setFont(s);
    }

    public void setFontSize(int i)
    {
        _chatPanel.setFontSize(i);
    }

    public void setUserList(String as[])
    {
        _chatPanel.setUserList(as);
    }

    public void show()
    {
        super.show();
        _chatPanel.requestFocus();
        _mainGUI.hideLogin();
    }

    public void userJoinedRoom(String s)
    {
        _chatPanel.userJoinedRoom(s);
    }

    public void userPartedRoom(String s, boolean flag)
    {
        _chatPanel.userPartedRoom(s, flag);
    }

    protected EnhancedChatPanel _chatPanel;
    protected String _room;
    protected ChatGUI _mainGUI;
    protected IChatServer _server;
    protected IChatGUIFactory _factory;
    protected Menu fileMenu;
    protected Menu fontStyleMenu;
    protected Menu fontSizeMenu;
    protected Menu helpMenu;
    protected CheckboxMenuItem miButtonsOn;
    protected CheckboxMenuItem miButtonsOff;
    protected CheckboxMenuItem fontSizeMenuItems[];
    protected CheckboxMenuItem fontStyleMenuItems[];
}
```

bei einer Menu funktion 

```
helpMenu.add(new MenuItem(Translator.getMessage("label.hilfe")));
```
ein Fenster aufgeht indem text steht ..welcher ist ja erstmal egal.

die stelle wo die funktion vermutlich ist ist wohl

```
if(Translator.getMessage("label.hilfe").equals(s))
		{
			_factory.getClass("Profil");
			return;
		}
```

so ich hoff diese ausführung ist ausführlich genug das ihr mir antworten könnt  :cry:


----------



## L-ectron-X (11. Jun 2004)

Wenn's ein einmaliger Aufruf werden soll, also der Dialog nur für diese eine Sache gebraucht wird, kannst Du folgenden Code in die betreffende Methode einfügen:

```
addMouseListener(new MouseAdapter() {
      public void mouseClicked(MouseEvent e) {
        final Dialog d = new Dialog( new Frame(), "Hilfe", true);
        d.setSize(400, 300);
        d.addWindowListener(new WindowAdapter() {
          public void windowClosing(WindowEvent e) {
            d.setVisible(false);
            d.dispose();
          }
        });
        d.setVisible(true);
      }
    });
```
Voraussetzung dafür ist aber der Import der entsprechenden AWT-Packages und dass bisher keine MouseEvents im vorhandenen Code abgefeuert und verarbeitet werden. Könnte sein, dass die sich sonst in die Quere kommen, müsste ausprobiert werden.

Wenn MouseEvents innerhalb des bestehenden Codes abgefeuert werden, reduziert sich der Code um einige Zeilen, da Du sie nur noch verarbeiten musst:

```
Dialog d = new Dialog( new Frame(), "Hilfe", true);
        d.setSize(400, 300);
        d.addWindowListener(new WindowAdapter() {
          public void windowClosing(WindowEvent e) {
            d.setVisible(false);
            d.dispose();
          }
        });
        d.setVisible(true);
```
Das setzt Du in die Methode, die den Dialog direkt aufrufen soll. Du kannst wie gesagt auch eine Extra Klasse schreiben, die von Dialog erbt und davon Instanzen bilden, die Du überall im Programm verwenden kannst.

Beide Code-Beispiele erzeugen einen modalen Dialog, der in der linken oberen Bildschirmecke erscheint.

_EDIT: Ups, im 2.Bsp. habe ich das final vergessen..._


----------



## Sinnlos (11. Jun 2004)

mhhh hab noch etwas womit ich nichts anfangen kann ...

und zwar  die "windowsAdapter()"  sorry bin neu im java programieren.

fehlermeldung:



> java.lang.Error: Unresolved compilation problem:
> WindowAdapter cannot be resolved or is not a type
> 
> at com.lyrisoft.chat.client.gui.awt102.ChatRoom.handleMenuEvent(ChatRoom.java:185)
> ...



also vermut ich mal das die windowAdapter() ersetzt werden muss ... nur durch was ? 

ich habe eine class die den fensterinhalt angibt da namens "Profil" im selben Packet (com.lyrisoft...)


----------



## L-ectron-X (11. Jun 2004)

Ich verstehe nicht, warum Du als Anfänger mit solchen Sachen anfängst. Lerne doch erst mal die Grundlagen, dann verstehst Du auch den Rest.

WindowAdapter ist eine Klasse, WindowAdapter() ihr Konstruktor. Er wird in diesem Beispiel _anonym_ aufgerufen, dass heißt, es wird zwar eine Instanz erzeugt, die aber nicht in einer Instanzvariable gespeichert.
Die Klasse WindowAdapter ist eine "Bequemlichkeitsklasse", die die Methoden des WindowListeners bereits in leeren Methodenrümpfen implementiert, so dass man nicht mehr alle Methoden des Listeners in seiner eigenen Klasse überschreiben muss.

Zu Deinem Problem: Sie mal nach, ob das Package java.awt.event importiert wird.
Wenn Du damit nichts anfangen kannst ist es Zeit für einen Anfängerkurs oder Dein erstes *gutes* Javabuch.
Nebenbei ich habe 8 davon im Schrank.


----------



## Sinnlos (12. Jun 2004)

L-ectron-X hat gesagt.:
			
		

> Ich verstehe nicht, warum Du als Anfänger mit solchen Sachen anfängst. Lerne doch erst mal die Grundlagen, dann verstehst Du auch den Rest.



Zitat: "Programmieren lernt man nur durch programmieren." Das mach ich ja wie du siehst irgendwie. Außerdem fehlt in unserer  "gemeinschaft" ein Java programierer der den Chat neu Bauen kann. Das mach ich nun sozusagen als Prüfung *gg

ok nun kommt ein neuer fehler:

```
if(Translator.getMessage("label.hilfe").equals(s))
		{
			Dialog cc = new Dialog( new Frame(), "Hilfe", true);
			cc.setSize(400, 300);
			cc.addWindowListener(new WindowAdapter() {
			  public void windowClosing(WindowEvent e) {
			  	cc.setVisible(false);
			  	cc.dispose();
			  }
			});
			cc.setVisible(true);
			return;			
		}
```

der fehler liegt hier in den zwei zeilen:


```
cc.setVisible(false);
			  	cc.dispose();
```

hier komm nun die meldung: 





> Cannot refer to a non-final variable d inside an inner class defined in a different method


----------



## Illuvatar (12. Jun 2004)

Aus deiner anonymen Klasse kannst du (wie in jeder Klasse, die in einer Methode steht), nur auf die Variablen der Methode zugreifen, wenn diese als final deklariert sind.
	
	
	
	





```
final Dialog cc ...
```


----------



## Sinnlos (12. Jun 2004)

soweit so gut der code 


```
if(Translator.getMessage("label.hilfe").equals(s))
		{
			final Dialog cc = new Dialog( new Frame(), "Hilfe", true);
			cc.setSize(400, 300);
			cc.addWindowListener(new WindowAdapter() {
			  public void windowClosing(WindowEvent e) {
			  	cc.setVisible(false);
			  	cc.dispose();
			  }
			});
			cc.setVisible(true);
			return;			
		}
```

aber er ursprung war eigendlich wie ich denn eine .class datei oder Inhalt in dieses Fenster einfüg.

danke aber dafür das ich schonmal weitergekommen bin )


----------



## L-ectron-X (12. Jun 2004)

Deine Eingangsfrage war, wie man aus einem Applet heraus ein/en Fenster/Dialog öffnen kann. :wink:
Du hast bisher nicht davon gesprochen, wie man einem Dialog auch noch Inhalte hinzu fügt.

Es kommt nun darauf, ob der Dialog öfter verwendet werden soll. Wenn ja, ist es besser eine eigene Klasse zu schreiben und die von java.awt.Dialog erben zu lassen.
Wenn nicht, kannst Du das, was der Dialog anzeigen soll nach der Instanziierung des Dialogs schreiben. Dafür sollte man sich in beiden Fällen etwas mit der AWT-Programmierung auseinander gesetzt haben.


----------



## Sinnlos (12. Jun 2004)

also ich hab eine vorbereitete klasse da ... da steht der inhalt und das aussehen des Fensters ... nur wie bekomm ich die in das script ?

ähm sorry dachte ich hätts geschrieben *gg aber das war auch nen problem


----------



## L-ectron-X (12. Jun 2004)

Also wenn Du eine bereits fertige Klasse hast, die von Dialog erbt, kann der Code z.B. so aussehen:

```
if(Translator.getMessage("label.hilfe").equals(s)) 
      { 
         MyDialog cc = new MyDialog();  
         cc.setVisible(true);         
      }
```
Das kommt nun wieder ganz auf den Code Deiner vorbereiteten Klasse an.
Wie sieht ihr Konstruktor aus? Werden irgendwelche Einstellungen vor genommen? Werden WindowEvents behandelt? usw.
Poste doch mal den Code Deiner vorbereiteten Klasse. Dann bekommen wir schon raus, wie der Code ausehen muss/kann.


----------



## Sinnlos (12. Jun 2004)

so sieht sie aus:

```
package com.lyrisoft.chat.client.gui.awt102;

import com.lyrisoft.awt.*;
import com.lyrisoft.chat.ICommands;
import com.lyrisoft.chat.Translator;
import com.lyrisoft.chat.client.gui.IChatClientInputReceiver;
import java.awt.*;

public class Profil extends Dialog
    implements HyperlinkReceiver
{

    public Profil(Frame frame, IChatClientInputReceiver ichatclientinputreceiver)
    {
        super(frame, Translator.getMessage("label.hilfe"), true);
        ok = new Button(Translator.getMessage("label.ok"));
        _inputReceiver = ichatclientinputreceiver;
        setLayout(new BorderLayout());
        textView = new HyperlinkTextView(true, this);
        TextStyle textstyle = new TextStyle(TextView.DEFAULT_FONT, Color.blue);
        textView.append("\n");
        textView.append("\n");
        textView.append("\n");
        textView.append("\n");
        textView.append("\n");
        textView.append(" \n");
        textView.append("\n");
        textView.append("\n");
        textView.append("\n");
        add("Center", textView);
        Panel panel = new Panel();
        panel.setLayout(new FlowLayout());
        panel.add(ok);
        add("South", panel);
        textView.resize(320, 200);
        pack();
        center();
        show();
    }

    public boolean action(Event event, Object obj)
    {
        if(event.target == ok)
        {
            hide();
            return true;
        } else
        {
            return super.action(event, obj);
        }
    }

    public void center()
    {
        Rectangle rectangle = getParent().bounds();
        Rectangle rectangle1 = bounds();
        move(Math.max(0, (rectangle.width - rectangle1.width) / 2 + rectangle.x), Math.max(0, (rectangle.height - rectangle1.height) / 2 + rectangle.y));
    }

    public void handleHyperlink(String s)
    {
        _inputReceiver.inputEvent("AboutBox", "/link " + s);
    }

    public static void main(String args[])
    {
        Frame frame = new Frame();
        About about = new About(frame, null);
    }

    private Button ok;
    private HyperlinkTextView textView;
    private IChatClientInputReceiver _inputReceiver;
}
```


----------



## L-ectron-X (12. Jun 2004)

Dann könnte der Code zum Öffnen dieses Dialoges aus einem Applet heraus so aussehen:

```
if(Translator.getMessage("label.hilfe").equals(s)) 
      { 
         final Profil cc = new Profil(new Frame(), ichatclientinputreceiver);
         cc.addWindowListener(new WindowAdapter() { 
           public void windowClosing(WindowEvent e) { 
              cc.setVisible(false); 
              cc.dispose(); 
           } 
         });
         //cc.setSize(400, 300); //einfügen, wenn der Dialog eine andere Größe haben soll
         cc.setVisible(true);          
      }
```
In der Klasse Profil konnte ich keine WindowEvent-Verarbeitung finden, die zum Schließen des Dialogs per Klick auf das "X" benötigt wird. Deshalb habe ich auch noch mal den WindowAdapter mitgegeben, der dies bewerkstelligen soll.
Du brauchst zum Erstellen des Dialogs eine Instanz der Klasse IChatClientInputReceiver, die der Dialog in seinem Konstruktor erwartet. Ob Profil in diesem Fall als final initialisiert werden muss, bin ich mir jetzt nicht sicher.

Würdeste mal in ein Buch gucken und mal ein wenig Java-Grundlagenstudium betreiben, würdest Du auch selber drauf kommen. Einfach Code abschreiben und dann irgendwo einbauen, davon lernt man kaum etwas über Java. Du musst verstehen, warum das so und eben nicht so gemacht wird.


----------



## Sinnlos (12. Jun 2004)

L-ectron-X hat gesagt.:
			
		

> Du brauchst zum Erstellen des Dialogs eine Instanz der Klasse IChatClientInputReceiver, die der Dialog in seinem Konstruktor erwartet. Ob Profil in diesem Fall als final initialisiert werden muss, bin ich mir jetzt nicht sicher.


was ist eine instanz ? 



> Würdeste mal in ein Buch gucken und mal ein wenig Java-Grundlagenstudium betreiben, würdest Du auch selber drauf kommen. Einfach Code abschreiben und dann irgendwo einbauen, davon lernt man kaum etwas über Java. Du musst verstehen, warum das so und eben nicht so gemacht wird.


schwer finden solche bücher ... aber ich sau grad 2 ;-)

aktueller fehler:



> java.lang.Error: Unresolved compilation problem:
> ichatclientinputreceiver cannot be resolved
> 
> at com.lyrisoft.chat.client.gui.awt102.ChatRoom.handleMenuEvent(ChatRoom.java:184)
> ...


[/quote]


----------



## L-ectron-X (12. Jun 2004)

Instanzen sind in Java Objekte, also konkrete Abbildungen einer Klasse. Eine Klasse ist praktisch der Bauplan für ein Objekt. Stelle Dir ein Objekt am einfachsten als "Ding" in der realen Welt vor. Dinge in der "realen Welt" kann man z.B. in vielen Fällen sehen oder anfassen...

Der Konstruktor (eine Methode zum Erzeugen von Objekten einer Klasse) von Profil erwartet ein Objekt/Instanz der Klasse IChatClientInputReceiver. Die musst Du ihm liefern. Entweder hast Du eine solche bereits irgendwo deklariert und/oder in Verwendung, oder Du musst noch eine erzeugen. Das hängt hier auch wieder vom bisherigen Quellcode ab.

Ich verstehe auch nicht, wozu das Ganze gut sein soll. Im Prinzip raten wir, die Dir helfen wollen, ins Blaue, nur weil Du nur Stückchen von dem, was Du vor hast Preis gibst.

Bücher online:
Java-Buch
Java ist auch eine Insel
Beide kostenlos und überaus ergiebig.


----------



## Sinnlos (12. Jun 2004)

mh sicher ? seh in den quelltext kein objekt solcher art ...

*nicht wirklich klarkomm im moment damit


----------



## Sinnlos (12. Jun 2004)

ich hab es hinbekommen ....  nach zahlreichen bastelleien ...aber es geht ...
am ende sieht der  code nun so aus:

```
if(Translator.getMessage("label.hilfe").equals(s)) 
		 { 
			final Profil cc = new Profil(new Frame()); 
			cc.addWindowListener(new WindowAdapter() { 
			  public void windowClosing(WindowEvent e) { 
				 cc.setVisible(false); 
				 cc.dispose(); 
			  } 
			}); 
			//cc.setSize(400, 300); //einfügen, wenn der Dialog eine andere Größe haben soll 
			cc.setVisible(true);          
		 }
```

damit das funktionierte hab ich einfach die ichatclientinput anforderung aus der Profil classe herausgenommen ... sie war eh nicht undbedingt notwendig.  danke auch für die 2 bücher  ich werd sie bei gelegenheit zu rate ziehen oder lesen *gg


----------

