# JApplet mit Chat



## Guest (22. Mai 2008)

Ich habe ein einfaches Chat Programm im Internet  gefunden.

Ich möchte das Chatapplet aber in ein normales JFrame umwandeln.
Wie kann ich das bewerkstelligen.

Wenn ich einfach extends JFrame statt extends JApplet schreibe, funktionieren
die Methoden


```
socket = new Socket(this.getCodeBase().getHost(), PORT);
			this.showStatus(e.toString());
```

nicht mehr. Gibt es da einen Ersatz.

Hier noch mal der komplette Code:


```
import java.net.*;
import java.io.*;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Event;
import java.awt.Font;

import javax.swing.JApplet;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class chatapplet extends JFrame implements Runnable
{
	private static final long serialVersionUID = 2588620415906363915L;
	
	public static final int PORT = 8768;
	Socket socket;
	DataInputStream in;
	PrintStream out;
	JTextField inputfield;
	JTextArea outputarea;
	Thread thread;

	public void init()
	{
		inputfield = new JTextField();
		outputarea = new JTextArea();
		outputarea.setFont( new Font("Dialog", Font.PLAIN, 12));
		outputarea.setEditable(false);

		this.setLayout(new BorderLayout());
		this.add( inputfield,BorderLayout.SOUTH);
		this.add( outputarea,BorderLayout.CENTER);
		this.setSize(300,200);
		
		this.setBackground(Color.lightGray);
		this.setForeground(Color.black);
		inputfield.setBackground(Color.white);
		outputarea.setBackground(Color.white);
	}

	public void start()
	{
		try
		{
			socket = new Socket(this.getCodeBase().getHost(), PORT);
			in = new DataInputStream(socket.getInputStream());
			out = new PrintStream(socket.getOutputStream());
		} catch (IOException e)
		{
			this.showStatus(e.toString());
			say("Verbindung zum Server fehlgeschlagen!");
			System.exit(1);
		}

		say("Verbindung zum Server aufgenommen...");

		if (thread == null)
		{
			thread = new Thread(this);
			thread.setPriority(Thread.MIN_PRIORITY);
			thread.start();
		}
	}


	public void stop()
	{
		try
		{
			socket.close();
		} catch (IOException e)
		{
			this.showStatus(e.toString());
		}

		if ((thread !=null) && thread.isAlive())
		{
			thread.interrupt();
			thread = null;
		}
	}


	public void run()
	{
		String line;

		try
		{
			while(true)
			{
				BufferedReader stdin =
					new BufferedReader ( new InputStreamReader( System.in ) );
				
				line = stdin.readLine();
				if(line!=null)
					outputarea.append(line+'\n' );
			}
		} catch (IOException e) { say("Verbindung zum Server abgebrochen"); }
	}


	public boolean action(Event e, Object what)
	{
		if (e.target==inputfield)
		{
			String inp=(String) e.arg;

			out.println(inp);
			inputfield.setText("");
			return true;
		}

		return false;
	}


	public void say(String msg)
	{
		outputarea.append("*** "+msg+" ***\n");
	}
}
```


----------



## Gast (23. Mai 2008)

Du brauchst auf jeden Fall eine Hauptklasse, die von JApplet erbt, und wenn sie nur dazu da ist, das JFrame zu öffnen.


----------



## Mirko07 (25. Mai 2008)

Ohne JApplet geht das aber auch:


1.
Du brauchst für die Applikation sowie eine Methode

```
public static void main(String[] args)...
```
Wenn Du auf der Kommandozeile den Host übergibst (z.B. http/localhost/) - getCodeBase() geht hier nicht- kannst Du die Host-Adresse variabel halten. 
z.B. 

```
public class chatapplet extends JFrame implements Runnable 
{
    String hostAdresse;
    ...

    public static void main (String[] args)
    {
        chatapplet chat = new chatapplet(args[0]);
    }
    public chatapplet(String hostAdresse)
    {
        this.hostAdresse = hostAdresse;
        init();
        start();
        ...
    }
...
    public void start()
    {
        socket = new Socket(hostAdresse,PORT);
        ...
    }
}
```

Zur Sicherheit sollte in main getestet werden, ob ein Argument übergeben wurde.

2.
showStatus(...) wird auch nix.
Ich empfehle ein Info-Fenster mit 

```
JOptionPane.showMessageDialog(..)
```


----------

