Class Document seltsam leere Zeile am Anfang

Status
Nicht offen für weitere Antworten.

vegeta

Aktives Mitglied
Hallo,

ich hab ein paar zeilen in ein JTextpane mit hilfe der insertString methode geschrieben.

und in ein JScrollPane gepackt.

Alles wird schön angezeigt nur die Anzeige beginnt ab der zweiten zeile und am ende wird noch eine Zeile

eingefügt.

Ich will aber keine leere Zeile am Anfang, mit der Zeile am Ende könnte ich leben 😉

Hat jmd. rat?
 
Hi,

das ist der konstruktor

Code:
 editor = new JTextPane();
       editor.addHyperlinkListener(this);
       editor.setEditable(false);
       
       editor.setContentType("text/html charset=EUC-JP");	
       editor.setEditorKit(new HTMLEditorKit()); 
       
       scroller=new JScrollPane(editor);
       
       
       //getContentPane().setLayout(new FlowLayout());
       
       getContentPane().add(scroller);
       fill2();

hier die fill2 Methode die für den Inhalt sorgt

Code:
       Document styledoc=editor.getDocument();  
        SimpleAttributeSet hrefAttr;
        SimpleAttributeSet attrs ;
       
        for (int i=0;i<20;i++)
        {
            hrefAttr = new SimpleAttributeSet();
            hrefAttr.addAttribute(HTML.Attribute.HREF, (new Integer(i)).toString());
            hrefAttr.addAttribute(HTML.Attribute.ID,(new Integer(i)).toString());
            attrs = new SimpleAttributeSet();
            attrs.addAttribute(HTML.Tag.A, hrefAttr);
            attrs.addAttribute(AttributeSet.NameAttribute, HTML.Tag.CONTENT);
            StyleConstants.setFontSize(attrs,12);
            StyleConstants.setForeground(attrs,Color.black);
            
            try {
                styledoc.insertString(styledoc.getLength(), "web" , attrs);
br);
            } catch (BadLocationException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

Danke für die hilfe
 
ich poste mal den kompletten code
vielleicht hilft das.
wie ich ein
einfüge ist etwas tricky vielleicht habt ihr noch eine andere möglichkeit aber wenn ihr das Problem mit den Zeilen löst wär ich echt weiter

Code:
//Datei: JEditorPaneEx.java
import java.awt.*;
import java.awt.Color;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputMethodEvent;
import java.awt.event.InputMethodListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.lang.reflect.InvocationTargetException;

import javax.swing.*;
import javax.swing.event.HyperlinkEvent;
import javax.swing.event.HyperlinkListener;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultEditorKit;
import javax.swing.text.DefaultStyledDocument;
import javax.swing.text.Document;
import javax.swing.text.Element;
import javax.swing.text.MutableAttributeSet;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.Style;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument;
import javax.swing.text.html.HTML;
import javax.swing.text.html.HTMLDocument;
import javax.swing.text.html.HTMLEditorKit;
import javax.swing.text.html.HTMLFrameHyperlinkEvent;



public class JEditorPaneEx2 extends JFrame implements HyperlinkListener
{
   // EditorPane erzeugen
   JTextPane editor;
   JScrollPane scroller;
   Point oldPoint;
   StringBuffer s;
   
  
       public void fill2()
    {
        
        Document styledoc=editor.getStyledDocument();  
        SimpleAttributeSet hrefAttr;
        SimpleAttributeSet attrs ;
        SimpleAttributeSet br=new SimpleAttributeSet();
        br.addAttribute(StyleConstants.NameAttribute, HTML.Tag.BR);
        StyleConstants.setForeground(br,Color.white);
        StyleConstants.setFontSize(br,12);
        for (int i=0;i<20;i++)
        {
            hrefAttr = new SimpleAttributeSet();
            hrefAttr.addAttribute(HTML.Attribute.HREF, (new Integer(i)).toString());
            hrefAttr.addAttribute(HTML.Attribute.ID,(new Integer(i)).toString());
            attrs = new SimpleAttributeSet();
            attrs.addAttribute(HTML.Tag.A, hrefAttr);
            attrs.addAttribute(AttributeSet.NameAttribute, HTML.Tag.CONTENT);
            StyleConstants.setFontSize(attrs,12);
            StyleConstants.setForeground(attrs,Color.black);
            
            try {
                styledoc.insertString(styledoc.getLength(), "web" , attrs);
                styledoc.insertString(styledoc.getLength(), "
" , br);
            } catch (BadLocationException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        
        //editor.setDocument(doci);
        
    }
   		
   	 
  
   public JEditorPaneEx2()
   {
       super ("JEditorPane-Beispiel");
       
       editor = new JTextPane();
       editor.addHyperlinkListener(this);
       editor.setEditable(false);
       editor.setContentType("text/html charset=EUC-JP");	
       editor.setEditorKit(new HTMLEditorKit());
       
       
       scroller=new JScrollPane(editor);
       
       
       //getContentPane().setLayout(new FlowLayout());
       
       getContentPane().add(scroller);
       fill2();
       setSize (300, 200);
   }

   public static void main (String[] args) 
   {
      JEditorPaneEx2 editorEx = new JEditorPaneEx2();
      editorEx.show();
   }


public void hyperlinkUpdate(HyperlinkEvent event) {
    // TODO Auto-generated method stub
    
    
  }


}
 
Füge die folgende Methode in die oben genannte Klasse ein
Code:
private void showElementTree() {
  final JFrame elementTreeFrame = new JFrame("ElementTree");
  elementTreeFrame.addWindowListener(new WindowAdapter() {
    public void windowClosing(WindowEvent e) {
      elementTreeFrame.setVisible(false);
    }
  });
  elementTreeFrame.getContentPane().setLayout(new BorderLayout());
  elementTreeFrame.getContentPane().add(new ElementTreePanel(editor));
  elementTreeFrame.pack();
  elementTreeFrame.setVisible(true);
}
und rufe sie am Ende des Konstruktors mit showElementTree() ; auf
Die Klasse ElementTreePanel findest Du im Demo-Verzeichnis von
JDK (jdk1.x.x/demo/jfc/Stylepad/src)
Kopiere sie in das Verzeichnis Deines Projekts und starte das ganze.
(evtl fehlen paar Imports ergänzen)

Wenn Du Dir die Struktur des Dokuments anschaust, wirst Du sehen, dass
Dein komplettes HTML in einem Paragraph-Element (

</p>) steckt.
HTMLEditorKit macht immer einen Zeilenumbruch vor einem neuen Paragraph,
daher Zeilenumbruch oben.
Den unteren Zeilenumbruch fügst Du selbst in der Schleife ein
Code:
try { 
  styledoc.insertString(styledoc.getLength(), "web" , attrs); 
  if(i<19) // das hier einfügen, dann ist es weg
    styledoc.insertString(styledoc.getLength(), "
" , br); 
} catch (BadLocationException e) { 
  //TODO Auto-generated catch block 
  e.printStackTrace(); 
}

Schau Dir am besten das Beispiel von Swing an (jdk1.x.x/demo/jfc/Stylepad/src)

Gruß,
Michael
 
oje oje die letzte leere Zeile geht auf meine Mütze, warum hab ich das nicht gesehen.

was macht die ElementTreePanel klasse genau?

ich hab eine möglichkeit gefunden das mit der ersten Zeile zu verhindern aber ich weis nicht so genau warum das geklappt hat.
Code:
       HTMLEditorKit kit= new HTMLEditorKit();
       StyleSheet style=new StyleSheet();
       style.addRule("Body { font-size: 10pt; }");
       kit.setStyleSheet(style);
       editor.setEditorKit(kit);

Weist du wie man das automatische parsen auf umlaute und sonderzeichen abstellt? Wenn man strings mit insertstring in das document reinlegt werden umlaute und sonderzeichen in html zeichen sprich & für & umgewandelt.
das ist eine schöne sache aber ich will das nicht
 
Die ElementTreePanel-Klasse zeigt die Struktur des Dokuments in einem JTree an. Probiere es einfach aus.
Das mit den Umlauten weiß ich nicht. Es passiert wahrscheinlich im HTMLWriter. Vermutlich müsstest Du den
halben HTMLEditorKit umschreiben, um das zu verhindern. Schreib Dir eine Methode, die solche Maskierung
wieder entfernt.
 
hallo, also diese möglichkeit ist mir auch in den sinn gekommen, aber das führt zu performance verlusst. ich versuch die stelle zu finden wo die umwandlung passiert und überschreibe dann die methode

das ganze passiert zwischen

styledoc.insertString(styledoc.getLength(), "web" , attrs);

und

HTMLEditorKit.write(...) in dieser Methode wird auch HTMLWrite

aufgerufen
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben