# Mysteriöser JTextPane Bug?



## Xavier (19. Okt 2007)

Hi,

Ich habe ein Applet mit einer JTextPane. Das läuft auch prima - wenn ich aber das Browser-Fenster neu lade spinnt das JTextPane. 

Der Text wird einwandfrei angezeit allerdings ist der Cursor weg, und den Text kann ich nicht mehr markieren. Dennoch kann ich mit der Maus CaretListener-Events auslösen. Ich kann mir das nicht erklären.

Irgendeine Idee?

Danke,
Xavier


----------



## André Uhres (20. Okt 2007)

Xavier hat gesagt.:
			
		

> ..Ich habe ein Applet mit einer JTextPane.
> ..wenn ich aber das Browser-Fenster neu lade..
> ..den Text kann ich nicht mehr markieren..


Bei mir bleibt der Text markierbar:
http://www.java-forum.org/de/userfiles/user3690/AppletTest.html
http://www.java-forum.org/de/userfiles/user3690/AppletTest.jar
(Quellcode im jar)


----------



## Xavier (20. Okt 2007)

André Uhres hat gesagt.:
			
		

> Xavier hat gesagt.:
> 
> 
> 
> ...



Nur ist mein Programm auch nicht so trivial. Wahrscheinlich generierst Du einmal das JTextPane und zerstörst es am Ende?

Ich habe einige Singletons, die auch weiterleben, nachdem destroy() aufgerufen wurde.


----------



## André Uhres (20. Okt 2007)

Ist das jetzt eine Quizfrage und wir müssen deinen Code erraten?


----------



## Guest (22. Okt 2007)

André Uhres hat gesagt.:
			
		

> Ist das jetzt eine Quizfrage und wir müssen deinen Code erraten?



Ich glaube das Problem ist wie ich erwähnt habe, dass ich nicht alles beim erneuten init() von Vorne generieren KANN! Ich habe keine andere Wahl. In deinem Minimalbeispiel ist es natürlich ein Kinderspiel alles von Vorne zu generieren.

Ich habe dein Beispiel mal umgeschrieben. Es wird eine JTextPane und ein Thread einmalig generiert und bei einem erneuten init() wiederverwendet. Teste es mal aus - wenn man reloaded ist das JTextPane tot...kein Copy/Paste, kein Löschen, keine Eingabe. Auch der Thread verhölt sich nach mehrmaligem Reload extrem seltsam.

P.S.: Ich weiss die offensichtliche Lösung ist einfach alles in Init() von grundauf neu zu erzeugen. Aber glaub mir die Option hab ich nicht - wie gesagt, es ist eine ausgewachsene Applikation. Ausserdem will ich nicht, dass der Inhalt der TextPane gelöscht...

package main;


import java.awt.BorderLayout;
import java.awt.Container;

import javax.swing.JApplet;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;


/**
* @author me
*
*/
public class Test extends JApplet {

   private static final long serialVersionUID = 1L;
     private static final Container contentPane = buildContentPane();

   private static Container buildContentPane() {
       System.out.println("buildContentPane");
       JPanel panel = new JPanel(new BorderLayout());
       JScrollPane jScrollPane = new JScrollPane();
       JTextPane textPane = new JTextPane();
       textPane.setText("JTextPane\naha\n");
       jScrollPane.setViewportView(textPane);
             panel.add(jScrollPane);
       return panel;
   }
        static Thread t = new Thread() {
             int counter = 0;
             @Override
       public void run() {
           while(true) {
               counter++;
               System.err.println("Another round: " + counter);
               try {
                   Thread.sleep(Long.MAX_VALUE);
               } catch (InterruptedException e) {System.err.println("\nContinue...");}
           }
       }
   };
     static {
       t.start();
   }

   public void init() {
       System.out.println("init()");
       this.setContentPane(contentPane);
       t.interrupt();
   }

   public void start() {
       System.out.println("start()");
   }

   public void stop() {
       System.out.println("stop()");
   }

   public void destroy() {
       System.out.println("destroy()");
       System.out.println();
   }

}


----------



## Guest (22. Okt 2007)

André Uhres hat gesagt.:
			
		

> Ist das jetzt eine Quizfrage und wir müssen deinen Code erraten?



Ich glaube das Problem ist wie ich erwähnt habe, dass ich nicht alles beim erneuten init() von Vorne generieren KANN! Ich habe keine andere Wahl. In deinem Minimalbeispiel ist es natürlich ein Kinderspiel alles von Vorne zu generieren.

Ich habe dein Beispiel mal umgeschrieben. Es wird eine JTextPane und ein Thread einmalig generiert und bei einem erneuten init() wiederverwendet. Teste es mal aus - wenn man reloaded ist das JTextPane tot...kein Copy/Paste, kein Löschen, keine Eingabe. Auch der Thread verhölt sich nach mehrmaligem Reload extrem seltsam.

P.S.: Ich weiss die offensichtliche Lösung ist einfach alles in Init() von grundauf neu zu erzeugen. Aber glaub mir die Option hab ich nicht - wie gesagt, es ist eine ausgewachsene Applikation. Ausserdem will ich nicht, dass der Inhalt der TextPane gelöscht...


```
package main;


import java.awt.BorderLayout;
import java.awt.Container;

import javax.swing.JApplet;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;


/**
* @author me
*
*/
public class Test extends JApplet {

   private static final long serialVersionUID = 1L;
     private static final Container contentPane = buildContentPane();

   private static Container buildContentPane() {
       System.out.println("buildContentPane");
       JPanel panel = new JPanel(new BorderLayout());
       JScrollPane jScrollPane = new JScrollPane();
       JTextPane textPane = new JTextPane();
       textPane.setText("JTextPane\naha\n");
       jScrollPane.setViewportView(textPane);
             panel.add(jScrollPane);
       return panel;
   }
        static Thread t = new Thread() {
             int counter = 0;
             @Override
       public void run() {
           while(true) {
               counter++;
               System.err.println("Another round: " + counter);
               try {
                   Thread.sleep(Long.MAX_VALUE);
               } catch (InterruptedException e) {System.err.println("\nContinue...");}
           }
       }
   };
     static {
       t.start();
   }

   public void init() {
       System.out.println("init()");
       this.setContentPane(contentPane);
       t.interrupt();
   }

   public void start() {
       System.out.println("start()");
   }

   public void stop() {
       System.out.println("stop()");
   }

   public void destroy() {
       System.out.println("destroy()");
       System.out.println();
   }

}
```


----------

