import 
    java.awt.BorderLayout;
 
   import 
    java.awt.Color;
 
   import 
    java.awt.event.ActionEvent;
 
   import 
    java.awt.event.ActionListener;
 
   import 
    java.io.File;

 
   import 
    javax.swing.BorderFactory;
 
   import 
    javax.swing.Box;
 
   import 
    javax.swing.ImageIcon;
 
   import 
    javax.swing.JButton;
 
   import 
    javax.swing.JComboBox;
 
   import 
    javax.swing.JFileChooser;
 
   import 
    javax.swing.JFrame;
 
   import 
    javax.swing.JLabel;
 
   import 
    javax.swing.JScrollPane;
 
   import 
    javax.swing.JTextField;
 
   import 
    javax.swing.JTextPane;
 
   import 
    javax.swing.UIManager;
 
   import 
    javax.swing.text.BadLocationException;
 
   import 
    javax.swing.text.SimpleAttributeSet;
 
   import 
    javax.swing.text.StyleConstants;
 
   import 
    javax.swing.text.StyledDocument;

 
   /** 
   
 * JTextPane的例子,模拟聊天客户端,演示了为每段文字设置字体、字号、样式、颜色、背景色和插入图片功能
 *  
   @author 
    五斗米 <如转载请保留作者和出处>
 * @blog  
    
   
  
   */ 
   

 
   public 
     
   class 
    Test  
   extends 
    JFrame {

  
   private 
     
   static 
     
   final 
     
   long 
    serialVersionUID  
   = 
     
   - 
   2397593626990759111L 
   ;

  
   private 
    JScrollPane scrollPane  
   = 
     
   null 
   ;  
   // 
    滚动 
   
 
   
  
   private 
    JTextPane text  
   = 
     
   null 
   ;  
   // 
    不用说了,如果不认识的话就没必要往后看了 
   
 
   
  
   private 
    Box box  
   = 
     
   null 
   ;  
   // 
    放输入组件的容器 
   
 
   
  
   private 
    JButton b_insert  
   = 
     
   null 
   , b_remove  
   = 
     
   null 
   , b_icon  
   = 
     
   null 
   ;  
   // 
    插入按钮;清除按钮;插入图片按钮 
   
 
   
  
   private 
    JTextField addText  
   = 
     
   null 
   ;  
   // 
    文字输入框 
   
 
   
  
   private 
    JComboBox fontName  
   = 
     
   null 
   , fontSize  
   = 
     
   null 
   , fontStyle  
   = 
     
   null 
   , fontColor  
   = 
     
   null 
   ,
   fontBackColor  
   = 
     
   null 
   ;  
   // 
    字体名称;字号大小;文字样式;文字颜色;文字背景颜色 
   
 
   
  
   private 
    StyledDocument doc  
   = 
     
   null 
   ;  
   // 
    非常重要插入文字样式就靠它了 
   
 
   
  
   public 
    Test() {
   
   super 
   ( 
   " 
   JTextPane Test 
   " 
   );
   
   try 
    {  
   // 
    使用Windows的界面风格 
   
 
      UIManager.setLookAndFeel( 
   " 
   com.sun.java.swing.plaf.windows.WindowsLookAndFeel 
   " 
   );
  }  
   catch 
    (Exception e) {
   e.printStackTrace();
  }
  text  
   = 
     
   new 
    JTextPane();
  text.setEditable( 
   false 
   );  
   // 
    不可录入 
   
 
     doc  
   = 
    text.getStyledDocument();  
   // 
    获得JTextPane的Document 
   
 
     scrollPane  
   = 
     
   new 
    JScrollPane(text);
  addText  
   = 
     
   new 
    JTextField( 
   18 
   );
  String[] str_name  
   = 
    {  
   " 
   宋体 
   " 
   ,  
   " 
   黑体 
   " 
   ,  
   " 
   Dialog 
   " 
   ,  
   " 
   Gulim 
   " 
    };
  String[] str_Size  
   = 
    {  
   " 
   12 
   " 
   ,  
   " 
   14 
   " 
   ,  
   " 
   18 
   " 
   ,  
   " 
   22 
   " 
   ,  
   " 
   30 
   " 
   ,  
   " 
   40 
   " 
    };
  String[] str_Style  
   = 
    {  
   " 
   常规 
   " 
   ,  
   " 
   斜体 
   " 
   ,  
   " 
   粗体 
   " 
   ,  
   " 
   粗斜体 
   " 
    };
  String[] str_Color  
   = 
    {  
   " 
   黑色 
   " 
   ,  
   " 
   红色 
   " 
   ,  
   " 
   蓝色 
   " 
   ,  
   " 
   黄色 
   " 
   ,  
   " 
   绿色 
   " 
    };
  String[] str_BackColor  
   = 
    {  
   " 
   无色 
   " 
   ,  
   " 
   灰色 
   " 
   ,  
   " 
   淡红 
   " 
   ,  
   " 
   淡蓝 
   " 
   ,  
   " 
   淡黄 
   " 
   ,  
   " 
   淡绿 
   " 
    };
  fontName  
   = 
     
   new 
    JComboBox(str_name);  
   // 
    字体名称 
   
 
     fontSize  
   = 
     
   new 
    JComboBox(str_Size);  
   // 
    字号 
   
 
     fontStyle  
   = 
     
   new 
    JComboBox(str_Style);  
   // 
    样式 
   
 
     fontColor  
   = 
     
   new 
    JComboBox(str_Color);  
   // 
    颜色 
   
 
     fontBackColor  
   = 
     
   new 
    JComboBox(str_BackColor);  
   // 
    背景颜色 
   
 
     b_insert  
   = 
     
   new 
    JButton( 
   " 
   插入 
   " 
   );  
   // 
    插入 
   
 
     b_remove  
   = 
     
   new 
    JButton( 
   " 
   清空 
   " 
   );  
   // 
    清除 
   
 
     b_icon  
   = 
     
   new 
    JButton( 
   " 
   图片 
   " 
   );  
   // 
    插入图片 
   
 
     b_insert.addActionListener( 
   new 
    ActionListener() {  
   // 
    插入文字的事件 
   
 
         
   public 
     
   void 
    actionPerformed(ActionEvent e) {
      insert(getFontAttrib());
      addText.setText( 
   "" 
   );
     }
    });
  b_remove.addActionListener( 
   new 
    ActionListener() {  
   // 
    清除事件 
   
 
         
   public 
     
   void 
    actionPerformed(ActionEvent e) {
      text.setText( 
   "" 
   );
     }
    });
  b_icon.addActionListener( 
   new 
    ActionListener() {  
   // 
    插入图片事件 
   
 
         
   public 
     
   void 
    actionPerformed(ActionEvent arg0) {
      JFileChooser f  
   = 
     
   new 
    JFileChooser();  
   // 
    查找文件 
   
 
         f.showOpenDialog( 
   null 
   );
      insertIcon(f.getSelectedFile());  
   // 
    插入图片 
   
 
        }
    });
  box  
   = 
    Box.createVerticalBox();  
   // 
    竖结构 
   
 
     Box box_1  
   = 
    Box.createHorizontalBox();  
   // 
    横结构 
   
 
     Box box_2  
   = 
    Box.createHorizontalBox();  
   // 
    横结构 
   
 
     box.add(box_1);
  box.add(Box.createVerticalStrut( 
   8 
   ));  
   // 
    两行的间距 
   
 
     box.add(box_2);
  box.setBorder(BorderFactory.createEmptyBorder( 
   8 
   ,  
   8 
   ,  
   8 
   ,  
   8 
   ));  
   // 
    8个的边距
   
   // 
    开始将所需组件加入容器 
   
 
     box_1.add( 
   new 
    JLabel( 
   " 
   字体: 
   " 
   ));  
   // 
    加入标签 
   
 
     box_1.add(fontName);  
   // 
    加入组件 
   
 
     box_1.add(Box.createHorizontalStrut( 
   8 
   ));  
   // 
    间距 
   
 
     box_1.add( 
   new 
    JLabel( 
   " 
   样式: 
   " 
   ));
  box_1.add(fontStyle);
  box_1.add(Box.createHorizontalStrut( 
   8 
   ));
  box_1.add( 
   new 
    JLabel( 
   " 
   字号: 
   " 
   ));
  box_1.add(fontSize);
  box_1.add(Box.createHorizontalStrut( 
   8 
   ));
  box_1.add( 
   new 
    JLabel( 
   " 
   颜色: 
   " 
   ));
  box_1.add(fontColor);
  box_1.add(Box.createHorizontalStrut( 
   8 
   ));
  box_1.add( 
   new 
    JLabel( 
   " 
   背景: 
   " 
   ));
  box_1.add(fontBackColor);
  box_1.add(Box.createHorizontalStrut( 
   8 
   ));
  box_1.add(b_icon);
  box_2.add(addText);
  box_2.add(Box.createHorizontalStrut( 
   8 
   ));
  box_2.add(b_insert);
  box_2.add(Box.createHorizontalStrut( 
   8 
   ));
  box_2.add(b_remove);
   
   this 
   .getRootPane().setDefaultButton(b_insert);  
   // 
    默认回车按钮 
   
 
      
   this 
   .getContentPane().add(scrollPane);
   
   this 
   .getContentPane().add(box, BorderLayout.SOUTH);
   
   this 
   .setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   
   this 
   .setSize( 
   600 
   ,  
   400 
   );
   
   this 
   .setLocationRelativeTo( 
   null 
   );
   
   this 
   .setVisible( 
   true 
   );
  addText.requestFocus();
 }

  
   /** 
   
  * 插入图片
  *
  *  
   @param 
    icon
   
   */ 
   
  
   private 
     
   void 
    insertIcon(File file) {
  text.setCaretPosition(doc.getLength());  
   // 
    设置插入位置 
   
 
     text.insertIcon( 
   new 
    ImageIcon(file.getPath()));  
   // 
    插入图片 
   
 
     insert( 
   new 
    FontAttrib());  
   // 
    这样做可以换行 
   
 
    }

  
   /** 
   
  * 将文本插入JTextPane
  *
  *  
   @param 
    attrib
   
   */ 
   
  
   private 
     
   void 
    insert(FontAttrib attrib) {
   
   try 
    {  
   // 
    插入文本 
   
 
      doc.insertString(doc.getLength(), attrib.getText()  
   + 
     
   " 
   /n 
   " 
   , attrib.getAttrSet());
  }  
   catch 
    (BadLocationException e) {
   e.printStackTrace();
  }
 }

  
   /** 
   
  * 获取所需要的文字设置
  *
  *  
   @return 
    FontAttrib
   
   */ 
   
  
   private 
    FontAttrib getFontAttrib() {
  FontAttrib att  
   = 
     
   new 
    FontAttrib();
  att.setText(addText.getText());
  att.setName((String) fontName.getSelectedItem());
  att.setSize(Integer.parseInt((String) fontSize.getSelectedItem()));
  String temp_style  
   = 
    (String) fontStyle.getSelectedItem();
   
   if 
    (temp_style.equals( 
   " 
   常规 
   " 
   )) {
   att.setStyle(FontAttrib.GENERAL);
  }  
   else 
     
   if 
    (temp_style.equals( 
   " 
   粗体 
   " 
   )) {
   att.setStyle(FontAttrib.BOLD);
  }  
   else 
     
   if 
    (temp_style.equals( 
   " 
   斜体 
   " 
   )) {
   att.setStyle(FontAttrib.ITALIC);
  }  
   else 
     
   if 
    (temp_style.equals( 
   " 
   粗斜体 
   " 
   )) {
   att.setStyle(FontAttrib.BOLD_ITALIC);
  }
  String temp_color  
   = 
    (String) fontColor.getSelectedItem();
   
   if 
    (temp_color.equals( 
   " 
   黑色 
   " 
   )) {
   att.setColor( 
   new 
    Color( 
   0 
   ,  
   0 
   ,  
   0 
   ));
  }  
   else 
     
   if 
    (temp_color.equals( 
   " 
   红色 
   " 
   )) {
   att.setColor( 
   new 
    Color( 
   255 
   ,  
   0 
   ,  
   0 
   ));
  }  
   else 
     
   if 
    (temp_color.equals( 
   " 
   蓝色 
   " 
   )) {
   att.setColor( 
   new 
    Color( 
   0 
   ,  
   0 
   ,  
   255 
   ));
  }  
   else 
     
   if 
    (temp_color.equals( 
   " 
   黄色 
   " 
   )) {
   att.setColor( 
   new 
    Color( 
   255 
   ,  
   255 
   ,  
   0 
   ));
  }  
   else 
     
   if 
    (temp_color.equals( 
   " 
   绿色 
   " 
   )) {
   att.setColor( 
   new 
    Color( 
   0 
   ,  
   255 
   ,  
   0 
   ));
  }
  String temp_backColor  
   = 
    (String) fontBackColor.getSelectedItem();
   
   if 
    ( 
   ! 
   temp_backColor.equals( 
   " 
   无色 
   " 
   )) {
    
   if 
    (temp_backColor.equals( 
   " 
   灰色 
   " 
   )) {
    att.setBackColor( 
   new 
    Color( 
   200 
   ,  
   200 
   ,  
   200 
   ));
   }  
   else 
     
   if 
    (temp_backColor.equals( 
   " 
   淡红 
   " 
   )) {
    att.setBackColor( 
   new 
    Color( 
   255 
   ,  
   200 
   ,  
   200 
   ));
   }  
   else 
     
   if 
    (temp_backColor.equals( 
   " 
   淡蓝 
   " 
   )) {
    att.setBackColor( 
   new 
    Color( 
   200 
   ,  
   200 
   ,  
   255 
   ));
   }  
   else 
     
   if 
    (temp_backColor.equals( 
   " 
   淡黄 
   " 
   )) {
    att.setBackColor( 
   new 
    Color( 
   255 
   ,  
   255 
   ,  
   200 
   ));
   }  
   else 
     
   if 
    (temp_backColor.equals( 
   " 
   淡绿 
   " 
   )) {
    att.setBackColor( 
   new 
    Color( 
   200 
   ,  
   255 
   ,  
   200 
   ));
   }
  }
   
   return 
    att;
 }

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

  
   /** 
   
  * 字体的属性类
   
   */ 
   
  
   private 
     
   class 
    FontAttrib {
   
   public 
     
   static 
     
   final 
     
   int 
    GENERAL  
   = 
     
   0 
   ;  
   // 
    常规 
   
 
   
   
   public 
     
   static 
     
   final 
     
   int 
    BOLD  
   = 
     
   1 
   ;  
   // 
    粗体 
   
 
   
   
   public 
     
   static 
     
   final 
     
   int 
    ITALIC  
   = 
     
   2 
   ;  
   // 
    斜体 
   
 
   
   
   public 
     
   static 
     
   final 
     
   int 
    BOLD_ITALIC  
   = 
     
   3 
   ;  
   // 
    粗斜体 
   
 
   
   
   private 
    SimpleAttributeSet attrSet  
   = 
     
   null 
   ;  
   // 
    属性集 
   
 
   
   
   private 
    String text  
   = 
     
   null 
   , name  
   = 
     
   null 
   ;  
   // 
    要输入的文本和字体名称 
   
 
   
   
   private 
     
   int 
    style  
   = 
     
   0 
   , size  
   = 
     
   0 
   ;  
   // 
    样式和字号 
   
 
   
   
   private 
    Color color  
   = 
     
   null 
   , backColor  
   = 
     
   null 
   ;  
   // 
    文字颜色和背景颜色 
   
 
   
   
   /** 
   
   * 一个空的构造(可当做换行使用)
    
   */ 
   
   
   public 
    FontAttrib() {
  }

   
   /** 
   
   * 返回属性集
   *
   *  
   @return 
   
    
   */ 
   
   
   public 
    SimpleAttributeSet getAttrSet() {
   attrSet  
   = 
     
   new 
    SimpleAttributeSet();
    
   if 
    (name  
   != 
     
   null 
   )
    StyleConstants.setFontFamily(attrSet, name);
    
   if 
    (style  
   == 
    FontAttrib.GENERAL) {
    StyleConstants.setBold(attrSet,  
   false 
   );
    StyleConstants.setItalic(attrSet,  
   false 
   );
   }  
   else 
     
   if 
    (style  
   == 
    FontAttrib.BOLD) {
    StyleConstants.setBold(attrSet,  
   true 
   );
    StyleConstants.setItalic(attrSet,  
   false 
   );
   }  
   else 
     
   if 
    (style  
   == 
    FontAttrib.ITALIC) {
    StyleConstants.setBold(attrSet,  
   false 
   );
    StyleConstants.setItalic(attrSet,  
   true 
   );
   }  
   else 
     
   if 
    (style  
   == 
    FontAttrib.BOLD_ITALIC) {
    StyleConstants.setBold(attrSet,  
   true 
   );
    StyleConstants.setItalic(attrSet,  
   true 
   );
   }
   StyleConstants.setFontSize(attrSet, size);
    
   if 
    (color  
   != 
     
   null 
   )
    StyleConstants.setForeground(attrSet, color);
    
   if 
    (backColor  
   != 
     
   null 
   )
    StyleConstants.setBackground(attrSet, backColor);
    
   return 
    attrSet;
  }

   
   /** 
   
   * 设置属性集
   *
   *  
   @param 
    attrSet
    
   */ 
   
   
   public 
     
   void 
    setAttrSet(SimpleAttributeSet attrSet) {
    
   this 
   .attrSet  
   = 
    attrSet;
  }

   
   /* 
    后面的注释就不写了,一看就明白  
   */ 
   

   
   public 
    String getText() {
    
   return 
    text;
  }

   
   public 
     
   void 
    setText(String text) {
    
   this 
   .text  
   = 
    text;
  }

   
   public 
    Color getColor() {
    
   return 
    color;
  }

   
   public 
     
   void 
    setColor(Color color) {
    
   this 
   .color  
   = 
    color;
  }

   
   public 
    Color getBackColor() {
    
   return 
    backColor;
  }

   
   public 
     
   void 
    setBackColor(Color backColor) {
    
   this 
   .backColor  
   = 
    backColor;
  }

   
   public 
    String getName() {
    
   return 
    name;
  }

   
   public 
     
   void 
    setName(String name) {
    
   this 
   .name  
   = 
    name;
  }

   
   public 
     
   int 
    getSize() {
    
   return 
    size;
  }

   
   public 
     
   void 
    setSize( 
   int 
    size) {
    
   this 
   .size  
   = 
    size;
  }

   
   public 
     
   int 
    getStyle() {
    
   return 
    style;
  }

   
   public 
     
   void 
    setStyle( 
   int 
    style) {
    
   this 
   .style  
   = 
    style;
  }
 }

}