ich vermute, der fehler ist wegen der for-schlaufe bzw. dem
setSelectionStart. der wiederholte aufruf macht zwar keinen sinn, aber ich
lass ab und zu ein search/replace über die jtextpane laufen, wo obiges
problem auch auftritt.
wieso tauchen die fehler auf? wie kann ichs verhindern?
danke im voraus...
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.io.FileOutputStream;
import java.util.Properties;
import com.sun.j3d.utils.applet.MainFrame;
import java.lang.String;
import java.lang.StringBuffer;
import javax.swing.*;
import javax.swing.text.*;
import javax.swing.text.rtf.*;
import javax.swing.text.StyledDocument;
import javax.swing.text.Style;
import javax.swing.text.StyleConstants;
import javax.swing.JTextPane;
public class se extends JApplet {
protected StyleContext m_context;
protected DefaultStyledDocument m_doc;
protected RTFEditorKit m_kit;
public se() {
JTextPane m_monitor = new JTextPane();
RTFEditorKit m_kit = new RTFEditorKit();
m_monitor.setEditorKit(m_kit);
m_context = new StyleContext();
m_doc = new DefaultStyledDocument(m_context);
m_monitor.setDocument(m_doc);
getContentPane().add(m_monitor, BorderLayout.CENTER);
File fChoosen = new
File("c://j2sdk1.4.2_03//Eigenes//Universe//trigokap10.rtf");
try {
InputStream in = new FileInputStream(fChoosen);
m_doc = new DefaultStyledDocument(m_context);
m_kit.read(in, m_doc, 0);
m_monitor.setDocument(m_doc);
in.close();
}
catch (Exception ex) { }
for(int w=0;w<9999000;w++) if (w % 10==0)
m_monitor.setSelectionStart(5700);
}
public static void main(String[] args) {
MainFrame a=new MainFrame(new se(),100,100);
}
}
java.lang.NullPointerException
at javax.swing.text.FlowView.changedUpdate(FlowView.java:264)
at
javax.swing.text.ParagraphView.changedUpdate(ParagraphView.java:680)
at javax.swing.text.View.forwardUpdateToView(View.java:1221)
at javax.swing.text.View.forwardUpdate(View.java:1192)
at javax.swing.text.BoxView.forwardUpdate(BoxView.java:222)
at javax.swing.text.View.changedUpdate(View.java:798)
at
javax.swing.plaf.basic.BasicTextUI$RootView.changedUpdate(BasicTextUI.java:1
515)
at
javax.swing.plaf.basic.BasicTextUI$UpdateHandler.changedUpdate(BasicTextUI.j
ava:1756)
at
javax.swing.text.AbstractDocument.fireChangedUpdate(AbstractDocument.java:21
3)
at
javax.swing.text.DefaultStyledDocument$ChangeUpdateRunnable.run(DefaultStyle
dDocument.java:2477)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:178)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:454)
at
java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.ja
va:201)
at
java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java
:151)
at
java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:145)
at
java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:137)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:100)
> catch (Exception ex) { }
> for(int w=0;w<9999000;w++) if (w % 10==0)
> m_monitor.setSelectionStart(5700);
> }
Kannst Du mal erklaeren, was dieser Code bezwecken soll?
Viele Gruesse,
Patrick
> ich vermute, der fehler ist wegen der for-schlaufe bzw. dem
> setSelectionStart. der wiederholte aufruf macht zwar keinen sinn, aber ich
> lass ab und zu ein search/replace über die jtextpane laufen, wo obiges
> problem auch auftritt.
>
> wieso tauchen die fehler auf? wie kann ichs verhindern?
> java.lang.NullPointerException
> at javax.swing.text.FlowView.changedUpdate(FlowView.java:264)
> at
> javax.swing.text.ParagraphView.changedUpdate(ParagraphView.java:680)
> at javax.swing.text.View.forwardUpdateToView(View.java:1221)
> at javax.swing.text.View.forwardUpdate(View.java:1192)
Hier sagt Dir ja Java schon freundlicherweise wo das Problem liegt.
Hast Du mal bei FlowView in der Zeile 264 nachgeschaut?
So sieht die Zeile aus:
layoutPool.changedUpdate(changes, a, f);
layoutPool ist eine Membervariable die NICHT im Konstruktor
initialisiert wird, sondern erst später. Ab und zu erwischst Du die
Klasse bevor sie sich im Bad fertig gemacht und gefrühstückt hat und
dann bekommst Du eine gewatscht. D.h. Du greifst auf layoutPool zu
bevor es initialisiert ist.
Mein Tip:
Swing ist eher gemächlich, lass Swing seine Zeit die es braucht, mit
so einer hektischen Schleife mag es nicht bombardiert werden.
Bei VB hätte man in jeden Schleifendurchlauf ein DOEVENTS eingebaut.
Bei Swing macht man das mit SwingUtilities.invokeLater() oder
SwingUtilities.invokeAndWait()
Probier mal die beiden Alternativen in Deinem Code aus (innerhalb
Deiner sehr persönlich gestallteten for-Schleife),
Entweder:
SwingUtilities.invokeLater(
new Runnable(){
public void run(){
m_monitor.setSelectionStart(5700);
}
});
Oder:
SwingUtilities.invokeAndWait(
new Runnable(){
public void run(){
m_monitor.setSelectionStart(5700);
}
});
Mit fröhlichen Grüßen
Magnus Benjes