Socket ChatClient

djtraumwelt

Mitglied
[Java] ChatClient - Pastebin.com

es geht um die funktion lesen, soweit ich den fehler einschränken kann. ich bekomme die erste nachricht vom server angezeigt und jede weitere nicht.

mit dem versuch
Java:
chat.append( String.valueOf( i ) );
bekomme ich die richtigen werte, die dann einfach hintendran angezeigt werden.

warum der inhalt zu diesen werten nicht? muss ich bei br.read noch irgendwas beachten oder beim char array buffer? bin am ende meines wissens und meiner try&error versuche angelangt und benötige hilfe.
 

djtraumwelt

Mitglied
also gut, mit readLine() und serverseitigem senden von \r\n funktioniert das nun. trotzdem danke für eure bemühungen.

Wenn jetzt noch jemand nen Tipp für meine GUI hätte...
 
I

irgendjemand

Gast
ohne mir jetzt deinen source anzusehen *geht grad leider nicht weil paste-bin grad dauerhaft zu nem load-error führt ... *ich hasse es wenn man tonnen von werbung hat** ... klingen

OutputStream.write() und InputStream.read() für n chat-system nicht grad passend

ich würde hier mit

PrintStream.println() und BufferedReader.readLine() arbeiten ...

hat auch den vorteil das du anstatt eines byte-arrays dierekt Strings verwenden kannst ...
 
I

irgendjemand

Gast
ok ... konnte mir jetzt mal dein code ansehen

1.) was macht das "\0" da ? ... ist die gegenstelle ein C programm ?

2.) DataOutputStream ist nicht gerade geeignet ... schon garnicht wenn du die geerbte methode OutputStream.write(byte[]) aufrufst ... dann hättest du dir den DataOutputStream auch echt sparen können ...
verwende hier lieber wie gesagt einen PrintStream
Java:
PrintStream out=new PrintStream(sock.getOutputStream());
und verwende dann die methode PrintStream.println(String)

3.) du hast nun schon ein BufferedReader ... und dann callst du InputStream.read(byte[], int, int) ? ... was machst du denn da ? verwende doch BufferedReader.readLine() ... die gibt dir einen String zurück

4.) ich würde hier KEIN Label verwenden ... sondern erstmal alles komplett auf Swing umstellen und dann eine JTextArea verwenden ... diese hat auch eine append(String) methode ... musst nur ans ende jeder zeile ein "\n" schreiben ...


au man ... da fehlen dir ja einige grundlagen was stream-kommunikation angeht ...
 

djtraumwelt

Mitglied
ja, mir fehlen so ziemlich sämtliche grundlagen für java, deswegen mach ich gerade auch lerning by doing und googlen und wenn google nicht weiterhilft das java-forum.

also vielen dank, für die nützlichen antworten, wie gesagt kommunikation funktioniert soweit und JA gegenstelle ist ein linux c programm.

das mit dem pastebin tut mir leid, da werd ich demnächst codes mit der java /java funktion so posten.

wegen der gui hab ich durch googlen auch schon erfahren, dass man swing nehmen sollte und das soweit es ging benutzt. aber das mit dem hintergrundbild schaut noch etwas schwierig für mich aus. brauch ich da eine eigene classe in einer eigenen datei um das mit der geerbten funktion und dem g.drawimage zu machen? und wenn das bildchen auf meinem server liegt, wie öffne ich das dann am einfachsten?
 
I

irgendjemande

Gast
gut ... wenn die gegenstelle ein C-programm ist dann stimmt zumindest das "\0" um für C das ende des strings erkennbar zu machen ...

ich nehme an das dieses ebenfalls mit solchen low-level funktionen arbeitet ... aber ob es in C auch sowas wie readLine gibt was dann automatisch das "\0" erkennt was von java beim verwenden von PrintStream.println(String) automatisch gesendet wird *glaub ich zumindest jetzt mal* weis ich nicht ... macht das ganz aber so oder so schwerer

ich glaube du solltest dir erstmal einen eigenen chat-server dierekt in java schreiben und dann erstmal mit diesem arbeiten um die grundlagen zu lernen ... später kann man das ganze dann an den C-server anpassen *was im großen und ganze nichts weiter als das hinzufügen / abtrennen von "\0" zur erkennung des string-endes sein sollte ... aber wie gesagt : kenn mich in C nicht aus ...

aber mein vorredner hat recht : eigne dir bitte erstmal grundlegende I/O grundlagen an *meinet wegen fang mit Byte-Buffer oder File-I/O an* und gehe dann schreitt für schritt richtung netzwerk ...
wenn du dann bei netzwerk-I/O bist ... versuch das ganze wie gesagt erstmal mit zwei von dir selbst geschriebenen java-programmen hinzubekommen ... die anpassung ans ziel-system stellt dann nur kleine änderungen im protokoll dar
 

djtraumwelt

Mitglied
es gibt auch PrintStream.print(String) das funktioniert einwandfrei mit \0 zum beenden der eingabe. UTF-8 funktioniert auch soweit, also netzwerktechnisch passt das jetzt alles. nur die gui macht mir schwierigkeiten.
 
I

irgendjemand

Gast
es gibt einen wesentlichen unterschied zwischen

print() und println()

pint sendet zwar den String den du senden willst ... schließt diesen aber nicht ab ...
wenn du auf der anderen seite mit einem readLine() liest ... dann returnt diese erst wenn ein \n empfangen wurde ... also ein NewLine

println hingegen sendet *wie der name sagt* am ende des strings noch ein NewLine mit *print Line* ... also kannst du auf der gegenseite auch mit readLine() lesen und bekommst immer nur genau diese "zeile" ...


was und wie genau du nun verwenden kannst hängt in erster linie vom server ab ... der *wie ichs bis jetzt verstanden habe* NICHT mit \n arbeitet ... daher bist du natürlich auf write(byte[], int, int) bzw read(byte[], int, int) angewiesen ... was aber wie ich bereits sagte für ein chat-system ... in dem nachrichten in der regel einzeilige ketten von darstellbaren zeichen sind ... aber wie gesagt : kenne mich in C nicht aus und weis daher nicht welche möglichkeiten man dort hat


was deine GUI angeht

was bitte soll das heißen du hast überall wo es ging versucht mit swing zu arbeiten ...

es gibt einie wichtige regel die besagt das man es vermeiden sollte AWT und Swing zu mischen ... also entweder alles komplett in AWT ... oder komplett in Swing ... mischformen können zu schweren fehlern führen ...
 

djtraumwelt

Mitglied
Java:
import java.applet.Applet;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

import java.io.*;
import java.net.*;

public class lxim extends Applet implements Runnable {

	public JTextArea ausgabe;
	public JTextArea onliste;
	public JTextField eingabe;
	public JTextField neingabe;
	public JTextField reingabe;

	public Socket sock;
	public PrintStream out;
	public InputStream in;
	public BufferedReader br;

	public StringBuffer chat = new StringBuffer();
	public StringBuffer liste = new StringBuffer();
	public String input = new String();
	public String vinput = new String();
	public String hattergsagt = new String();

	public int xx = 0, yy = 0;
	
	public Component ein, rein, nein, aus, onl;

	Thread t = null;
	
	public void start ()
	{
		t = new Thread(this);
		t.start();
	}
	
	public void init ()
	{
		verbinden ();
		eingabe = new JTextField ();
		ausgabe = new JTextArea ();
		onliste = new JTextArea ();

		setLayout( null );
		ein = add ( eingabe );
		aus = add ( new JScrollPane( ausgabe ) );
		onl = add ( new JScrollPane( onliste ) );
		
		setsize();
		
		Font font = new Font ("Serif", Font.PLAIN, 14);

		ausgabe.setFont (font);
		onliste.setFont (font);
		eingabe.setFont (font);

		ausgabe.setEditable( false );
		ausgabe.setLineWrap( true );
		onliste.setEditable( false );
		float[] hsbvals = new float[3];
		Color.RGBtoHSB( 150, 200, 250, hsbvals );
		onliste.setBackground( Color.getHSBColor(hsbvals[0], hsbvals[1], hsbvals[2]) );
		Color.RGBtoHSB( 200, 250, 150, hsbvals );
		ausgabe.setBackground( Color.getHSBColor(hsbvals[0], hsbvals[1], hsbvals[2]) );
		eingabe.setBackground( Color.getHSBColor(hsbvals[0], hsbvals[1], hsbvals[2]) );

		eingabe.addActionListener(
				new ActionListener () {
					public void actionPerformed (ActionEvent ev) {
						senden ();
					}
				}
		);

	}

	public void run () {
		while ( t == Thread.currentThread() ) {
			lesen ();
			checksize();
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				
			}
		}
	}

	public void checksize() {
		if ( xx != getWidth() || yy != getHeight() ) {
			xx = getWidth();
			yy = getHeight();
			setsize();
		}
	}
	
	public void setsize() {
		ein.setBounds( 0, getHeight()-24, ( getWidth()*75 )/100, 24 );
		aus.setBounds( 0, 0, ( getWidth()*75 )/100, getHeight()-24 );
		onl.setBounds( ( getWidth()*75 )/100, 0, ( getWidth()*25 )/100, getHeight() );
	}

	public void stop () {
		try {
			in.close();
			out.close();
			sock.close();
		} catch (IOException e) {
		}
	}
	
	public void verbinden () {
		try {
			sock = new Socket ("djtraumwelt.de", 6000);
			out = new PrintStream (sock.getOutputStream(), true, "UTF-8" );
			hattergsagt = "NAME " + getParameter("NAME") + "\0";
			out.print (hattergsagt);
			out.flush();
			
			in = sock.getInputStream();
			InputStreamReader inr = new InputStreamReader(in, "UTF-8");
			br = new BufferedReader(inr);
			
		} catch (UnknownHostException e) {
			
		} catch (IOException e) {
			
		}
	}
	
	public void senden () {
		if (eingabe.getText().startsWith("/go ")) {
			rsenden();
			eingabe.setText ("");
			return;
		}
		if (eingabe.getText().startsWith("/nick ")) {
			nsenden();
			eingabe.setText ("");
			return;
		}

		hattergsagt = "SAY " + eingabe.getText() + "\0";
		out.print (hattergsagt);
		out.flush();
		eingabe.setText ("");
	}
	
	public void nsenden () {
		hattergsagt = "NAME " + eingabe.getText().substring(6) + "\0";
		out.print (hattergsagt);
		out.flush();
	}
	
	public void rsenden () {
		hattergsagt = "RAUM " + eingabe.getText().substring(4) + "\0";
		out.print (hattergsagt);
		out.flush();
	}
	
	public void lesen () {
		try {
			if ( br.ready() ) {
				input = br.readLine();
				if ( input.startsWith("SAY ") ) {
					vinput = input.substring( 4 );
					ausgabe.append ( vinput + "\r\n" );
					int x;
					ausgabe.selectAll();
					x = ausgabe.getSelectionEnd();
					ausgabe.select( x, x );
				}

				if ( input.startsWith("LIST ") ) {
					vinput = new String( input.substring( 5 ) );
					liste = new StringBuffer();
					liste.append( vinput );
					liste.append( "\r\n" );
				}

				if ( input.startsWith("list ") ) {
					vinput = new String( input.substring( 5 ) );
					liste.append( vinput );
					liste.append( "\r\n" );
				}

				if ( input.startsWith("ENDL") ) {
					onliste.setText ( liste.toString() );
				}
				
			}
		} catch (IOException e) {
		}
	}
}

so schaut es bis jetzt aus und funktioniert soweit, schaut nur kacke aus

und der unterschied zwischen print und println ist mir schon klar und ich will den string mit 0 abschließen ohne newline
 
I

irgendjemand

Gast
also ohne mir den code weiter anzusehen

du leitest von Applet ab ... das ist AWT ...
und verwendest dann darin Swing-components ?

ein absolutes NO GO

wenn ... dann solltest du erstmal vom swing-applet : JApplet ableiten ...

auch würde ich nicht Component *awt* sondern JComponent *swing* verwenden ...
 

Michael...

Top Contributor
[schaut nur kacke aus
Das hast Du doch selbst in der Hand? Allerdings finde ich es unschön keinen LayoutManager zu verwenden und die Größe der Komponenten fest vorzugeben.
auch würde ich nicht Component *awt* sondern JComponent *swing* verwenden ...
Die Component Variablen referenzieren ja auf Swing Komponenten, ist daher nicht problematisch und in manchen Fällen auch notwendig. Hier allerdings nicht und des schaut schon ein bisschen merkwürdig aus, dass hier quasi "indirekt" referenziert wird.
Beim JApplet statt Applet stimme ich zu, wobei das wohl auch keine Probleme verursachen sollte. Aber wenn man grundsätzlich mit Swing Komponenten arbeitet könnte man auch ein JApplet drumrum nutzen.
 
I

irgendjemand

Gast
soweit ich weis gibt es rein funktionsmäßig keinen unterschied zwischen Applet und JApplet ... jedoch beim "zeichnen" ...

Applet z.b. stellt keine paintComponent() methode bereit ... JApplet allerdings schon ...
auch ist JApplet desshalb zu verwenden da es in swing als top-container gekenntzeichnet ist ... und damit selbst auch light-weight ist

alles in allem macht es wohl wirklich keinen unterschied ... aber weist ja wie das is : entweder komplette AWT oder komplett Swing ... mischen soll mans ja nicht ...

bei dem mit Component war ich mir erlich gesagt nicht sicher ... ja klar weis ich das JComponent im endeffekt auch nur von Component abgeleitet ist ... aber gibt doch schon unterschiede *wie das angesprochene paintComponent()*
 

Michael...

Top Contributor
Applet z.b. stellt keine paintComponent() methode bereit ... JApplet allerdings schon ...
will ja nicht kleinlich sein, aber um das richtig zustellen. JApplet erbt genauso wie Applet seine paint von Container eine paintComponent() wie andere Swing Komponenten besitzt die Klasse nicht (genauso wie JFrame auch keine paintComponent() besitzt)
bei dem mit Component war ich mir erlich gesagt nicht sicher ... ja klar weis ich das JComponent im endeffekt auch nur von Component abgeleitet ist ... aber gibt doch schon unterschiede *wie das angesprochene paintComponent()*
Das hatte ich nur angesprochen, weil im obigen Code die Component Variablen - warum auch immer - nur dazu genutzt werden, um Referenzen auf ein JTextField und JScrollPanes zu halten. Also keine AWT Komponenten im Applet verbaut werden.
aber weist ja wie das is : entweder komplette AWT oder komplett Swing ... mischen soll mans ja nicht ...
Dem stimme ich voll zu.
 

djtraumwelt

Mitglied
sämtliche tutorials verwenden awt UND swing, deshalb krieg ichs nicht gebacken ganz auf awt zu verzichten.

ein problem:
mit
Java:
					ausgabe.setText( chat.toString() + "</span><br>");
					ausgabe.setCaretPosition(ausgabe.getDocument().getLength());

versuche ich erst den Text zu setzen, dann runterzuscrollen. funktioniert, bis auf die kleinigkeit, dass er für den bruchteil einer sekunde den anfang des textes anzeigt und dann erst runterscrollt, was ein flackern zur folge hat und das finde ich sehr unschön. irgendeine idee, wie ich settext dazu kriege nicht wieder hochzuscrollen? oder wie ich das anders löse?

hier nochmal was ich bis jetzt alles habe:
Java:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

import java.io.*;
import java.net.*;

import org.apache.commons.lang.StringEscapeUtils;

public class lxim extends JApplet implements Runnable {

	static final long serialVersionUID = 1;

	public LXTextArea ausgabe;
	public LXTextArea onliste;
	public JTextField eingabe;
	public JTextField neingabe;
	public JTextField reingabe;
	public JComboBox roomlist;
	public JFrame frame;
	public JViewport scrollaus, scrollonl;

	public Socket sock;
	public PrintStream out;
	public InputStream in;
	public BufferedReader br;

	
	URL endurl;

	public StringBuffer chat = new StringBuffer("<span style=\"color:white; font-family:Comic Sans MS; font-size:13pt;\">");
	public StringBuffer liste = new StringBuffer();
	public String input = new String();
	public String vinput = new String();
	public String hattergsagt = new String();

	public String rooms[] = {
			"Lobby",
			"zocken",
			"Idlers",
			"Nerds",
			"Verdammte",
			"Sexy"
	};

	public int xx = 0, yy = 0;
	
	public Component ein, rein, nein, aus, onl, rom;

	Thread t = null;
	
	public void start ()
	{
		t = new Thread(this);
		t.start();
		try {
			endurl = new URL("http://www.djtraumwelt.de/lxim");
		} catch (MalformedURLException e) {
		}
		while (t != null) {
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
			}
		}
		getAppletContext().showDocument(endurl);
	}

	public void init ()
	{
		eingabe = new JTextField ();
		ausgabe = new LXTextArea ("http://www.djtraumwelt.de/imgs/ausgabe.png");
		onliste = new LXTextArea ("http://www.djtraumwelt.de/imgs/onliste.png");
		roomlist = new JComboBox (rooms);
		scrollaus = new JViewport();
		scrollaus.setView(ausgabe);
		scrollonl = new JViewport();
		scrollonl.setView(onliste);

		frame = new JFrame("LXIM");
		frame.setSize(800, 500);

		frame.setLayout( null );
		ein = frame.getContentPane().add ( eingabe );
		aus = frame.getContentPane().add ( scrollaus );
		onl = frame.getContentPane().add ( scrollonl );
		rom = frame.getContentPane().add ( roomlist );

		frame.setVisible(true);

		frame.addWindowListener(new WindowAdapter(){
		      public void windowClosing(WindowEvent we){
		    	  t = null;
		      }
		});

		setsize();
		
		Font font = new Font ("Serif", Font.PLAIN, 14);

		ausgabe.setContentType("text/html");
		//ausgabe.setFont (font);
		onliste.setFont (font);
		eingabe.setFont (font);
		roomlist.setFont (font);
		roomlist.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if ( e.getActionCommand() == "comboBoxChanged" ) {
					rsenden();
				}
			}
		});

		//ausgabe.setForeground(Color.white);
		onliste.setForeground(Color.white);
		ausgabe.setEditable( false );
		//ausgabe.setLineWrap( true );
		//ausgabe.setWrapStyleWord(true);
		onliste.setEditable( false );
		ausgabe.setOpaque(false);
		onliste.setOpaque(false);

		eingabe.addActionListener(
				new ActionListener () {
					public void actionPerformed (ActionEvent ev) {
						senden ();
					}
				}
		);

	}

	public void run () {
		verbinden ();
		while ( t == Thread.currentThread() ) {
			lesen ();
			checksize();
			try {
				Thread.sleep(16);
			} catch (InterruptedException e) {
				t.interrupt();
			}
		}
		try {
			in.close();
			out.close();
			sock.close();
		} catch (IOException e) {
		}
	}

	public void checksize() {
		if ( xx != frame.getWidth() || yy != frame.getHeight() ) {
			xx = frame.getWidth();
			yy = frame.getHeight();
			if (frame.isVisible()) {
				setsize();
			}
		}
	}
	
	public void setsize() {
		int xxx = frame.getInsets().left;
		xxx += frame.getInsets().right;
		xxx = frame.getWidth() - xxx;
		int yyy = frame.getInsets().top;
		yyy += frame.getInsets().bottom;
		yyy = frame.getHeight() - yyy;
		
		ein.setBounds( 0, yyy-24, ( xxx*75 )/100, 24 );
		aus.setBounds( 0, 0, ( xxx*75 )/100, yyy-24 );
		onl.setBounds( ( xxx*75 )/100, 0, ( xxx*25 )/100, yyy-24 );
		rom.setBounds( ( xxx*75 )/100, yyy-24, ( xxx*25 )/100, 24 );
		ausgabe.setText( chat.toString() + "</span><br>");
		onliste.setText ( liste.toString() );
		roomlist.setVisible(false);
		roomlist.setVisible(true);
	}

	public void stop () {
		t = null;
	}
	
	public void verbinden () {
		try {
			sock = new Socket ("djtraumwelt.de", 6000);
			sock.setTcpNoDelay(true);
			out = new PrintStream (sock.getOutputStream(), true, "UTF-8" );
			hattergsagt = "NAME " + getParameter("NAME") + "\0";
			out.print (hattergsagt);
			out.flush();
			hattergsagt = "RAUM " + getParameter("RAUM") + "\0";
			out.print (hattergsagt);
			out.flush();
			
			in = sock.getInputStream();
			InputStreamReader inr = new InputStreamReader(in, "UTF-8");
			br = new BufferedReader(inr);
			
		} catch (UnknownHostException e) {
			
		} catch (IOException e) {
			
		}
	}
	
	public void senden () {
		if (eingabe.getText().startsWith("/nick ")) {
			nsenden();
			eingabe.setText ("");
			return;
		}

		hattergsagt = "SAY " + eingabe.getText() + "\0";
		out.print (hattergsagt);
		out.flush();
		eingabe.setText ("");
	}
	
	public void nsenden () {
		hattergsagt = "NAME " + eingabe.getText().substring(6) + "\0";
		out.print (hattergsagt);
		out.flush();
	}
	
	public void rsenden () {
		hattergsagt = "RAUM " + rooms[roomlist.getSelectedIndex()] + "\0";
		out.print (hattergsagt);
		out.flush();
	}
	
	public void lesen () {
		try {
			if ( br.ready() ) {
				input = br.readLine();
				if ( input.startsWith("SAY ") ) {
					vinput = StringEscapeUtils.escapeHtml( input.substring( 4 ) );

					vinput = vinput.replaceAll(":\\)", "<img src=\"http://www.djtraumwelt.de/imgs/icon_smile.gif\">");
					vinput = vinput.replaceAll("=\\)", "<img src=\"http://www.djtraumwelt.de/imgs/icon_smile.gif\">");
					vinput = vinput.replaceAll(":\\(", "<img src=\"http://www.djtraumwelt.de/imgs/icon_nosmile.gif\">");
					vinput = vinput.replaceAll("=\\(", "<img src=\"http://www.djtraumwelt.de/imgs/icon_nosmile.gif\">");
					vinput = vinput.replaceAll(":D", "<img src=\"http://www.djtraumwelt.de/imgs/icon_biggrin.gif\">");
					vinput = vinput.replaceAll("=D", "<img src=\"http://www.djtraumwelt.de/imgs/icon_biggrin.gif\">");
					vinput = vinput.replaceAll(":P", "<img src=\"http://www.djtraumwelt.de/imgs/icon_baeh.gif\">");
					vinput = vinput.replaceAll("=P", "<img src=\"http://www.djtraumwelt.de/imgs/icon_baeh.gif\">");

					chat.append(vinput + "<br>");
					ausgabe.setText( chat.toString() + "</span><br>");
					ausgabe.setCaretPosition(ausgabe.getDocument().getLength());
				}

				if ( input.startsWith("LIST ") ) {
					vinput = new String( input.substring( 5 ) );
					liste = new StringBuffer();
					liste.append( vinput );
					liste.append( "\r\n" );
				}

				if ( input.startsWith("list ") ) {
					vinput = new String( input.substring( 5 ) );
					liste.append( vinput );
					liste.append( "\r\n" );
				}

				if ( input.startsWith("ENDL") ) {
					onliste.setText ( liste.toString() );
				}
				
			}
		} catch (IOException e) {
		}
	}
}
 
I

irgendjemand

Gast
da du scheinbar mit google nicht umgehen kannst hier mal ein beispiel in reinem AWT

Kaffee & Kuchen - Datenbank-Anbindung mit JDBC

für die ausgabe wird eine TextArea verwendet in welche der inhalt geadded und dann ebenfalls "runtergescrollt" wird ...

selbst wenn man das ganze nach Swing "übersetzt" und damit das double-buffering hat entsteht kein flackern ...

ich habe mir auch deinen code nicht weiter angesehen ...
 

djtraumwelt

Mitglied
Ja bei der JTextArea gibt es append, das gibt es bei JTextPane nicht und das brauch ich für Smilies. Bei JTextPane gibt es nur settext, was dazu führt, dass er hoch und wieder runterscrollt -> es flackert.
 
I

irgendjemand

Gast
ist völlig verständlich wenn du jedes mal den text mit setText(String) völlig neu setzt ...
wo jedoch genau dein problem ist verstehe ich nicht ...

und wer sagt das du mit einer JTextArea keine smilies darstellen kannst ? du musst nur das Document entsprechend überschreiben und ggf die paintComponent überschreiben ... machbar ist das aber auf jeden fall ... man muss es nur low-level genug machen ... und das erreicht man eben unter anderem in dem man ads nötige selbst zeichnet ... schließlich verwendet auch eine JTextArea ganz tief auf der ebene wo der gewünschte text angezeigt wird eine methode um den text zu zeichnen ... und alles was du für deine smilies machen musst ist auf diese eben in diese methode runter und sie so überschreiben das wenn ein smilie-code "gezeichnet" werden soll anstatt des codes einfach das smilie selbst ..


btw : dein getResource("http://...") funktioniert zwar .. ist aber kein wirklich guter stil und kann zu problemen führen ...
packe deine smilies lieber mit ins jar und lade diese dierekt ... zu mal du diese dann nur einmal laden musst ... und nicht wie in deinem beispiel jedes mal
 
I

irgendjemand

Gast
die will ich auch nich kennen ...

ich habs euch schon mal gesagt ...

[edit]L-ectron-X hat hier mal das Geschwafel entfernt[/edit]
 
Zuletzt bearbeitet von einem Moderator:

xehpuk

Top Contributor
Bei JTextPane gibt es nur settext, was dazu führt, dass er hoch und wieder runterscrollt -> es flackert.
Bei JEditorPane und JTextPane arbeitet man normalerweise mit dem [JAPI]javax.swing.text.Document[/JAPI]. Dort gibt es eine Methode [c]insertString()[/c], mit der man Text hinzufügen kann.
Runterscrollen brauchst du nicht, da dies automatisch geschieht, wenn das Caret versucht, sichtbar zu werden, siehe bei [JAPI]javax.swing.text.JTextComponent[/JAPI]:
By default the caret tracks all the document changes performed on the Event Dispatching Thread and updates it's position accordingly if an insertion occurs before or at the caret position or a removal occurs before the caret position.
Code:
DefaultCaret
tries to make itself visible which may lead to scrolling of a text component within
Code:
JScrollPane
. The default caret behavior can be changed by the [JAPI]javax.swing.text.DefaultCaret#setUpdatePolicy(int)[/JAPI] method.
 

djtraumwelt

Mitglied
das mit dem document hab ich nicht wirklich kappiert aber durchaus versucht ohne erfolg.

hab mir nach stundenlangem versuchen dann letztendlich nen doublebuffer selbst gemacht. guckst du hier:
Java:
					chat.append( vinput + "<br>");
					if (isflipped) {
						scrollaus.setView( ausgabe2 );
						ausgabe.setText( chat.toString() + "</div>" );
						ausgabe.select(ausgabe.getText().length(), ausgabe.getText().length());
						scrollaus.setView( ausgabe );
						isflipped = false;
					} else {
						scrollaus.setView( ausgabe );
						ausgabe2.setText( chat.toString() + "</div>" );
						ausgabe2.select(ausgabe2.getText().length(), ausgabe2.getText().length());
						scrollaus.setView( ausgabe2 );
						isflipped = true;
					}
das ding funktioniert soweit
 

xehpuk

Top Contributor
Wie hast du es denn versucht? Deine Lösung ist alles andere als optimal.

Vielleicht hilft dir ja ein Blick in den Source-Code von [JAPI]javax.swing.JTextArea#append(java.lang.String)[/JAPI], da wird nichts anderes gemacht:
[JAVA=466] /**
* Appends the given text to the end of the document. Does nothing if
* the model is null or the string is null or empty.
*
* @param str the text to insert
* @see #insert
*/
public void append(String str) {
Document doc = getDocument();
if (doc != null) {
try {
doc.insertString(doc.getLength(), str, null);
} catch (BadLocationException e) {
}
}
}[/code]
Genau so kannst du es auch mit einer JTextPane machen.
 

Ähnliche Java Themen

Neue Themen


Oben