简体   繁体   English

如何从JtextPane获取样式?

[英]How to get style from JtextPane?

I have a JtextPane with formatted text. 我有一个带有格式化文本的JtextPane。 I need to copy the complete style and attributes from this text to transfer it to another JtextPane. 我需要从此文本复制完整的样式和属性,以将其传输到另一个JtextPane。 Is there an example or code snippet to see how it works? 是否有示例或代码片段来查看其工作原理?

ok, here is a code I found and I've changed a little bit: 好的,这是我找到的代码,但做了一些更改:

import java.awt.*;
import javax.swing.*;
import javax.swing.text.*;

public class Main  {

private JTextPane textPane1;
private JTextPane textPane2;
private Document doc1;
private Document doc2;
private JFrame frame1;
private JFrame frame2;

private MutableAttributeSet black;    
private MutableAttributeSet red;
private AttributeSet attribute;    

public Main() {
    textPane1 = new JTextPane();

    black = new SimpleAttributeSet();
    red = new SimpleAttributeSet();
    StyleConstants.setForeground(black, Color.black);
    StyleConstants.setForeground(red, Color.red);
    textPane1.setEditorKit(new StyledEditorKit());                    
    doc1 = textPane1.getDocument();       

    append1("This is a Test!\n");

    //set color = red
    attribute = red;
    append1("Hello world! Hello Stackoverflow\n");        

    //set color = black
    attribute = black;
    append1("the text is black again\n");     

    StyledDocument styledDocument = textPane1.getStyledDocument();

    textPane2 = new JTextPane();
    textPane2.setEditorKit(new StyledEditorKit());
    doc2 = textPane2.getDocument();
    String text = textPane1.getText();
    append2(text);

    //transfer format data of text in frame1 to frame2
    int docLength = doc1.getLength();
    Element element;        
    AttributeSet attribSet;
    for(int i=0;i<docLength;i++) {            
        element = styledDocument.getCharacterElement(i);            
        attribSet = element.getAttributes();            
        StyleConstants.setForeground(red, Color.red);
    }

    createFrames();        
}

private void append1(String text){
    try {
        doc1.insertString(doc1.getLength(), text, attribute);
    } catch (BadLocationException ex) {
        ex.printStackTrace();
    }
}

private void append2(String text) {
    try {
        doc2.insertString(doc2.getLength(), text, attribute);
    } catch (BadLocationException ex) {
        ex.printStackTrace();
    }
}

private void createFrames() {
    frame1 = new JFrame("frame 1");     
    frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame1.setSize(400, 300);
    frame1.setLocationRelativeTo(null);
    frame1.getContentPane().add(new JScrollPane(textPane1), BorderLayout.CENTER);
    frame1.setVisible(true);

    frame2 = new JFrame("frame 2");
    frame2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame2.setSize(400, 300);
    frame2.setLocation(300,0);
    frame2.getContentPane().add(new JScrollPane(textPane2), BorderLayout.CENTER);
    frame2.setVisible(true);
}

public static void main(String args[]) {
    new Main();     
}
}

I also want to transfer format styles and attributes to the second frame. 我也想将格式样式和属性传输到第二帧。

I've solved it. 我已经解决了

在此处输入图片说明
import java.awt.*; 导入java.awt。*;

import javax.swing.*;
import javax.swing.text.*;

public class Main  {

private JTextPane textPane1;
private JTextPane textPane2;
private Document doc1;
private Document doc2;
private JFrame frame1;
private JFrame frame2;

private MutableAttributeSet black;    
private MutableAttributeSet red;
private AttributeSet attribute;    

public Main() throws BadLocationException {
    textPane1 = new JTextPane();

    black = new SimpleAttributeSet();
    red = new SimpleAttributeSet();
    StyleConstants.setForeground(black, Color.black);
    StyleConstants.setForeground(red, Color.red);
    textPane1.setEditorKit(new StyledEditorKit());                    
    doc1 = textPane1.getDocument();       

    append1("This is a Test!\n");

    //set color = red
    attribute = red;
    append1("Hello world! Hello Stackoverflow\n");        

    //set color = black
    attribute = black;
    append1("the text is black again\n");     


    //IMPORTANT PART: attribute of each character from the styled text will 
    //be transfered to the second textpanel
    StyledDocument styledDocument = textPane1.getStyledDocument();   
    Element element; 

    textPane2 = new JTextPane();
    textPane2.setEditorKit(new StyledEditorKit());

    doc2 = textPane2.getDocument(); 
    for(int i=0; i<styledDocument.getLength();i++) {
        element = styledDocument.getCharacterElement(i);
        AttributeSet attributeNew = element.getAttributes();   
        System.out.println(i);
        append2(styledDocument.getText(i, 1), attributeNew);    
    }

    createFrames();        
}

private void append1(String text){
    try {
        doc1.insertString(doc1.getLength(), text, attribute);
    } catch (BadLocationException ex) {
        ex.printStackTrace();
    }
}

private void append2(String text, AttributeSet attributeNew) {
    try {
        doc2.insertString(doc2.getLength(), text, attributeNew);
    } catch (BadLocationException ex) {
        ex.printStackTrace();
    }
}

private void createFrames() {
    frame1 = new JFrame("frame 1");     
    frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame1.setSize(400, 300);
    frame1.setLocationRelativeTo(null);
    frame1.getContentPane().add(new JScrollPane(textPane1), BorderLayout.CENTER);
    frame1.setVisible(true);

    frame2 = new JFrame("frame 2");
    frame2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame2.setSize(400, 300);
    frame2.setLocation(300,0);
    frame2.getContentPane().add(new JScrollPane(textPane2), BorderLayout.CENTER);
    frame2.setVisible(true);
}

public static void main(String args[]) throws BadLocationException {
    new Main();     
}
}

I'd like to add some improvements to this solution. 我想对该解决方案进行一些改进。 The texts with the same style can be caught by getParagraphElement(int pos) instead of each single character. 可以使用getParagraphElement(int pos)而不是每个单个字符来捕获具有相同样式的文本。 The first element starts at pos 0, followed by the next at: element.getEndOffset() + 1. 第一个元素从pos 0开始,然后是第二个元素:element.getEndOffset()+ 1。

But we have to traverse down the tree of sub elements to get all the character attributes. 但是我们必须遍历子元素树以获取所有字符属性。

package demo;

import java.awt.*;
import javax.swing.*;
import javax.swing.text.*;

public class TextPaneDemo {

  private JTextPane textPane1;
  private JTextPane textPane2;
  private StyledDocument doc1;
  private StyledDocument doc2;
  Private JFrame frame1;
  private JFrame frame2;


  public TextPaneDemo () {

    MutableAttributeSet black = new SimpleAttributeSet();
    StyleConstants.setForeground(black, Color.black);
    MutableAttributeSet red = new SimpleAttributeSet();
    StyleConstants.setForeground(red, Color.red);
    MutableAttributeSet blue = new SimpleAttributeSet();
    StyleConstants.setForeground(blue, Color.blue);
    StyleConstants.setBold(blue, true);

    textPane1 = new JTextPane();
    textPane1.setEditorKit(new StyledEditorKit());                    
    doc1 = textPane1.getStyledDocument();       

    textPane2 = new JTextPane();
    textPane2.setEditorKit(new StyledEditorKit());
    doc2 = textPane2.getStyledDocument();

    createFrames();

    append(doc1, black, "This is a Test!\n");
    append(doc1, red,   "Hello world! Hello Stackoverflow\n");        
    append(doc1, blue,  "Hello ");        
    append(doc1, red,   "Stackoverflow\n");        
    append(doc1, black, "the text is black again\n");     

    copyDoc (doc1, doc1.getParagraphElement(0), doc2);
  }

  private static void append(StyledDocument doc, AttributeSet style, String text) {
    try {
        doc.insertString(doc.getLength(), text, style);
    } catch (BadLocationException ex) {
        ex.printStackTrace();
    }
  }

  private static int copyDoc(StyledDocument doc1, Element elem, StyledDocument doc2)  {
    int pos = elem.getStartOffset();
    while( pos < doc1.getLength()) {       
      Element element = doc1.getParagraphElement(pos);
      pos = copyElem(doc1, element, doc2);
    }
    return pos;
  }

  private static int copyElem(StyledDocument doc1, Element elem, StyledDocument doc2)  {
    int pos = elem.getStartOffset();
    if (elem.getElementCount() <= 1) {
      int length = elem.getEndOffset() - elem.getStartOffset();
      AttributeSet attribSet = elem.getElementCount() == 0 ?
         elem.getAttributes() : 
         elem.getElement(0).getAttributes();
      try {
        String text = doc1.getText(elem.getStartOffset(), length);
        append(doc2, attribSet, text);
      } catch(BadLocationException e) {      }
      pos = elem.getEndOffset();
    } else {
      for (int sub = 0; sub < elem.getElementCount(); sub++) {
         Element sElem = elem.getElement(sub);
         pos = copyElem(doc1, sElem, doc2);
      }
      pos = elem.getEndOffset();
    }
    return pos;
  }

  private void createFrames() {
    frame1 = new JFrame("frame 1");
    frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame1.setSize(400, 300);
    frame1.setLocationRelativeTo(null);
    frame1.getContentPane().add(new JScrollPane(textPane1), BorderLayout.CENTER);
    frame1.setVisible(true);

    frame2 = new JFrame("frame 2");
    frame2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame2.setSize(400, 300);
    frame2.setLocation(frame1.getLocation().x + frame1.getWidth(), frame1.getLocation().y);
    frame2.getContentPane().add(new JScrollPane(textPane2), BorderLayout.CENTER);
    frame2.setVisible(true);
  }

  public static void main(String args[]) {
    new TextPaneDemo();
  }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM