# JEditorPane soll Grafik aus php laden



## Exminster (15. Februar 2007)

*Hi Leute*

Ich programmiere gerade einen Chat und bin bei einem Problem angekommen, wo ich nicht mehr weiter weiß.

Für die Ausgabe der Chatnachrichten benutze ich ein
JEditorPane ( in einem JScrollpanel, editChat.setEditable(false); ).

Die Chat-Userbilder werden mittels PHP-Skirpt aus einer Datenbank geladen. (Das kann ich nicht ändern, da es nicht meine HP ist und ich nur den Chat schreibe.) 


```
String userBild = "<img src=http://..../image.php?u=" + userID + " border=0 >";
HTMLDocument doc = (HTMLDocument)editChat.getDocument();
     try{
        ((HTMLEditorKit)editChat.getEditorKit()).insertHTML(doc, doc.getLength(), userbild, 0, 0, null);
     }
     catch (IOException ioe){}
     catch(BadLocationException ble){}
```

'editChat' ist das JEditorPane und die 'userID' ist die Nummer die das PHP--Skript braucht damit es weiß, welches Bild geladen werden soll.

Nun zu meinem Problem:
Wenn ich das Programm im Appletviewer starte funktioniert alles wunderbar und jedes Biild wird neu geladen.

Wenn ich das Programm als "signiertes Applet" im Browser aufrufe dann wird immer nur das selbe Bild dargestellt -das erste was von der PHP-Datei dargestellt wurde- egal welche 'userID' ich angebe. Es kommt mir so vor als würde er alles nach '..image.php' weglassen und das Bild aus dem Cache laden.
Am PHP-Skript liegt es nicht, da es ja im Appletviewer und auf der Homepage so funktioniert wie es soll.
Die 'userID' wird auch kerrekt angegeben, das habe ich überprüft.

Ich hoffe ich habe mich verständlich ausgedrückt und Ihr könnt mir sagen wo da der Fehler ist.
Vielen Dank Rene'


----------



## Thomas Darimont (15. Februar 2007)

Hallo!

schau mal hier:

```
/**
 * 
 */
package de.tutorials;

import java.awt.Dimension;

import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.text.html.HTMLEditorKit;

/**
 * @author Tom
 * 
 */
public class DisplayImageInJEditorPaneExample extends JFrame {

    JEditorPane editorPane;

    public DisplayImageInJEditorPaneExample() {
        super("DisplayImageInJEditorPaneExample");
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        editorPane = new JEditorPane();
        editorPane.setEditorKit(new HTMLEditorKit());
        editorPane
                .setText("<img src=\"http://www.tutorials.de/forum/images/misc/tuts_uc.gif\" border=\"0\" alt=\"tutorials.de - Forum, Tutorial, Anleitung, Schulung, Hilfe &amp; Chat\" />");
        editorPane.setPreferredSize(new Dimension(400, 300));
        add(editorPane);

        pack();
        setVisible(true);
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        new DisplayImageInJEditorPaneExample();
    }
}
```

Gruß Tom


----------



## Exminster (15. Februar 2007)

Erstmal danke für Dein Bemühen aber leider hilft mir das nicht weiter. Ich hatte mich am Anfang, glaube ich, auch nicht richtig ausgedrückt.

Hier wartet mein Socket bis eine Nachricht vom Server reinkommt.

```
....
try {
   StreamIn = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
   StreamOut = new PrintWriter(clientSocket.getOutputStream(), true);
    sockState = 1;
   while (sockState > 0){
         String stringIn = StreamIn.readLine();
	 if (stringIn != null){
             printMessage(stringIn);
         }

   }
} catch (IOException ioe) ....
```
Und hier soll dann der Text in das Editorfeld eingetragen werden.


```
public void printMessage(String message ){
   String[]  tmpMessage = message.Split("\t");
   htmlcode =  "<img src=http://www.toleranza.de/hwboard/showimage.php?u=" + tmpMessage[0] + " border=0 >";
   htmlcode = htmlcode + " von: " + tmpMessage[1];
   htmlcode = htmlcode + " Nachricht: " + tmpMessage[2] + "<br>";
		
   HTMLDocument doc = (HTMLDocument)editChat.getDocument();

   try{
	((HTMLEditorKit)editChat.getEditorKit()).insertHTML(doc, doc.getLength(), htmlcode, 0, 0, null);
   }
   catch (IOException ioe){}
  catch(BadLocationException ble){}
}
```

Im Endeffekt soll er halt die neuen Nachrichten im JEditorPane  hinten anhängen. Das macht er ja auch, sowohl  im Appletviever und als "signiertest Applet" im Browser.

Nur ist halt im Browser das Problem z.B:

Es sind 2 Leute im Chat user1 und user2
user1 schreibt eine Nachricht und bei beiden erscheint im JEditoPane

(*Bild *von user1)   *von:* User1 *Nachricht:* bla bla

Jetzt antwortet user2 und bei beiden erscheint im JEditorPane

(*Bild *von user1) *von *User2 *Nachricht: *das was user2 geschrieben hat.

Und da ist das Problem das er mir nicht das Bild neu läd obwohl ich eine ander Userid (tmpMessage[0]) angegebn habe - das habe ich überprüft.


Das Beispiel oben hilft mir leider nicht sehr viel, weil es eine Applikation ist und ich fürchte es wird da genau so wunderbar funktionieren im Appletviewer. 

Ich hatte auch schon probiert für jede neue Nachricht eine neues JEditorPane zu erstellen und im ScrollPanel darzustellen, mit dem selben Effekt das er die Neuen Bilder nicht ordenlich läd.

Hat jemand vielleicht noch eine Andere Idee. 
Liegt es vielleicht an Jave 6.

Vielen Dank


----------



## Thomas Darimont (16. Februar 2007)

Hallo,

dann schau mal hier:

```
/**
 * 
 */
package de.tutorials;

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Date;

import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.Timer;
import javax.swing.text.Element;
import javax.swing.text.html.HTMLDocument;
import javax.swing.text.html.HTMLEditorKit;

/**
 * @author Tom
 * 
 */
public class DisplayImageInJEditorPaneExample extends JFrame {

    JEditorPane editorPane;
    final String imageCode = "<img src=\"http://www.tutorials.de/forum/images/misc/tuts_uc.gif\"/>";
    Timer timer;
    int currentRow;

    public DisplayImageInJEditorPaneExample() {
        super("DisplayImageInJEditorPaneExample");
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        editorPane = new JEditorPane();
        editorPane.setEditorKit(new HTMLEditorKit());
        editorPane.setText("<table id=\"table\"><tr id=\"currentRow:"
                + currentRow + "\">" + imageCode + " Bla Bla Bla</tr></table>");

        JScrollPane scrollPane = new JScrollPane(editorPane);
        scrollPane.setPreferredSize(new Dimension(640, 480));

        add(scrollPane);
        timer = new Timer(2000, new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                HTMLDocument htmlDocument = (HTMLDocument) editorPane
                        .getDocument();
                Element element = htmlDocument.getElement("currentRow:"
                        + currentRow);
                try {
                    htmlDocument.insertAfterEnd(element, "<tr id=\"currentRow:"
                            + (++currentRow) + "\">" + imageCode
                            + " Bla Bla Bla" + new Date() + " </tr>");
                } catch (Exception e1) {
                    e1.printStackTrace();
                }
            }
        });
        timer.start();

        pack();
        setVisible(true);
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        new DisplayImageInJEditorPaneExample();
    }
}
```

Gruß Tom


----------



## Exminster (16. Februar 2007)

Sorry Thomas,
aber leider hilft mir das auch nicht weiter.

Aber das ist nicht das Problem, wenn ich mehrere Gif-Smilies anzeigen lasse funktioniert das. 
Mein Problem ist das ich eine PHP-Datei aufrufe und ihr eine Userid übergebe und die "malt mir das Bild" mit den Daten aus eine MySQL Datenbank zu dieser Userid. Und wenn ich die Userid ändere, weil ich ein anderen Datensatzt gezeichtet haben will, ignoriert der EditorPane das und malt mir das vorherige Bild.(obwohl die andere Userid angegeben ist)

Ich habe es auch schon versucht in den JEditoPane nur 4 Bilder hintereinander darzustellen
<img src="image.php?userid=1"><img src="image.php?userid=2"><img src="image.php?userid=3"><img src="image.php?userid=4">
er zeigt mir 4 verschieden Bilder. 
Sobald ich aber im Browser auf reload klicke stellt er mir auch noch 4 Bilder dar, aber 4mal das 1 Bild. Die anderen holte er gar nicht. und da ist das Problem.

Wenn ich die Bilder über Toolkit.getImage hole passt ja alles, eben nur das EditoPane will die anderen Datensätze nicht laden sobald ich es im Browser starte.

Gibt es da irgendwo einen Cache den ich abschalten muß?.

Ich glaube langsam das wir aneinander vorbeireden.


----------



## Thomas Darimont (16. Februar 2007)

Hallo,

okay, jetzt weis ich was du meinst...
scheinbar werden die Images der einzelnen User mit dem selben namen an den Client (den JEditorPane) geschickt, welcher dann natürlich meint, dass er das Bild ja schon hat. Ich weis im Moment nicht ob es eine Möglichkeit gibt dieses Caching abzuschalten. Du müsstest irgendwie dafür sorgen das jedes Bild einen eindeutigen Namen/id bekommt und somit vom JEditorPane als "neu" betrachtet wird (wenns noch nicht da war).

Gruß Tom


----------



## Exminster (16. Februar 2007)

Vielen Dank Thomas

Jetzt hast Du mir sehr geholfen, weil  jetzt endlich wußte wo der Fehler lag, denn darauf bin ich von allein nicht gekommen. Wie gesagt das PHP-Skript war fertig und ich hatte gar nicht gewußt das es einen Namen mitschickt.

Auf jedenfall war Dein Tip sehr hilfreich und ich konnte den Fehler beheben.

Du bist einfach Spitze

Danke Gruß Rene'


----------



## Billie (18. Februar 2007)

Darf ich fragen was für einen Header etc. du jetzt mitschieckst mit dem Bild?


----------



## Exminster (19. Februar 2007)

Wie gesagt das PHP-Skript zum anzeigen des Benutzeravatars war bereits von den Programmierern des vBulletin- Boards geschrieben worden. Ich muß mich halt erst nachmal näher damit beschäftigen um genau herauszufinden welchen Header ich mitschicken muß damit er nur die Bilder läd die er noch nicht hat.

Momentan habe ich mit folgenenden Headern :

header("Content-type: image/jpeg");
header("Cache-Control: no-store, no-cache, must-revalidate");

Aber damit werden alle Bilder neu geladen, auch die die er bereits angezeigt hat.


----------

