Java Tutorial/Swing/SimpleAttributeSet

Материал из Java эксперт
Перейти к: навигация, поиск

Add colored text to the document

   <source lang="java">

import java.awt.Color; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTextPane; import javax.swing.text.AttributeSet; import javax.swing.text.SimpleAttributeSet; import javax.swing.text.StyleConstants; import javax.swing.text.StyleContext; public class Main extends JTextPane {

 public void append(Color c, String s) {
   StyleContext sc = StyleContext.getDefaultStyleContext();
   AttributeSet aset = sc.addAttribute(SimpleAttributeSet.EMPTY, StyleConstants.Foreground, c);
   int len = getDocument().getLength();
   setCaretPosition(len);
   setCharacterAttributes(aset, false);
   replaceSelection(s);
 }
 public static void main(String argv[]) {
   Main pane = new Main();
   for (int n = 1; n <= 4; n += 1) {
       pane.append(Color.black, String.valueOf(n) + " ");
   }
   JFrame f = new JFrame("ColorPane example");
   f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   f.setContentPane(new JScrollPane(pane));
   f.setSize(600, 400);
   f.setVisible(true);
 }

}</source>





Creating Styled Text: Using a SimpleAttributeSet

Key Constants for Storing AttributeSet Values



   <source lang="java">

AttributeSet Key Constants Value Type Default Setting

CharacterConstants.Background Color Color.BLACK

ColorConstants.Background Color Color.BLACK

CharacterConstants.BidiLevel Integer 0

CharacterConstants.Bold Boolean false

FontConstants.Bold Boolean false CharacterConstants.ruponentAttribute Component null CharacterConstants.Family String "Monospaced"

FontConstants.Family String "Monospaced"

CharacterConstants.Foreground Color Color.BLACK

ColorConstants.Foreground Color Color.BLACK

CharacterConstants.IconAttribute Icon null

CharacterConstants.Italic Boolean false

FontConstants.Italic Boolean false

CharacterConstants.Size Integer 12

FontConstants.Size Integer 12

CharacterConstants.StrikeThrough Boolean false

CharacterConstants.Subscript Boolean false

CharacterConstants.Superscript Boolean false

CharacterConstants.Underline Boolean false

ParagraphConstants.Alignment Integer ALIGN_LEFT ParagraphConstants.FirstLineIndent Float 0 ParagraphConstants.LeftIndent Float 0

ParagraphConstants.LineSpacing Float 0

ParagraphConstants.Orientation unknown unknown

ParagraphConstants.RightIndent Float 0

ParagraphConstants.SpaceAbove Float 0

ParagraphConstants.SpaceBelow Float 0 ParagraphConstants.TabSet TabSet null</source>





Tests two attributed strings for equality.

   <source lang="java">

/*

* JCommon : a free general purpose class library for the Java(tm) platform
* 
*
* (C) Copyright 2000-2005, by Object Refinery Limited and Contributors.
* 
* Project Info:  http://www.jfree.org/jcommon/index.html
*
* This library is free software; you can redistribute it and/or modify it 
* under the terms of the GNU Lesser General Public License as published by 
* the Free Software Foundation; either version 2.1 of the License, or 
* (at your option) any later version.
*
* This library is distributed in the hope that it will be useful, but 
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 
* License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, 
* USA.  
*
* [Java is a trademark or registered trademark of Sun Microsystems, Inc. 
* in the United States and other countries.]
* 
* ------------------------------
* AttributedStringUtilities.java
* ------------------------------
* (C)opyright 2005, by Object Refinery Limited and Contributors.
*
* Original Author:  David Gilbert (for Object Refinery Limited);
* Contributor(s):   -;
*
* $Id: AttributedStringUtilities.java,v 1.2 2005/10/18 13:24:19 mungady Exp $
*
* Changes
* -------
* 29-Jul-2005 : Version 1(DG);
* 
*/

import java.text.AttributedCharacterIterator; import java.text.AttributedString; import java.text.CharacterIterator; import java.util.Map; /**

* Some utility methods for working with AttributedString
* objects.
* 
* @author David Gilbert
*/

public class AttributedStringUtilities {

 /**
  * Tests two attributed strings for equality.
  * 
  * @param s1
  *          string 1 (null permitted).
  * @param s2
  *          string 2 (null permitted).
  * 
  * @return true if s1 and s2 are
  *         equal or both null, and false
  *         otherwise.
  */
 public static boolean equal(AttributedString s1, AttributedString s2) {
   if (s1 == null) {
     return (s2 == null);
   }
   if (s2 == null) {
     return false;
   }
   AttributedCharacterIterator it1 = s1.getIterator();
   AttributedCharacterIterator it2 = s2.getIterator();
   char c1 = it1.first();
   char c2 = it2.first();
   int start = 0;
   while (c1 != CharacterIterator.DONE) {
     int limit1 = it1.getRunLimit();
     int limit2 = it2.getRunLimit();
     if (limit1 != limit2) {
       return false;
     }
     // if maps aren"t equivalent, return false
     Map m1 = it1.getAttributes();
     Map m2 = it2.getAttributes();
     if (!m1.equals(m2)) {
       return false;
     }
     // now check characters in the run are the same
     for (int i = start; i < limit1; i++) {
       if (c1 != c2) {
         return false;
       }
       c1 = it1.next();
       c2 = it2.next();
     }
     start = limit1;
   }
   return c2 == CharacterIterator.DONE;
 }

}</source>





Use SimpleAttributeSet with JTextPane

   <source lang="java">

import java.awt.Color; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTextPane; import javax.swing.text.SimpleAttributeSet; import javax.swing.text.StyleConstants; public class Main extends JTextPane {

 public void appendNaive(Color c, String s) {
   SimpleAttributeSet aset = new SimpleAttributeSet();
   StyleConstants.setForeground(aset, c);
   int len = getText().length();
   setCaretPosition(len);
   setCharacterAttributes(aset, false);
   replaceSelection(s);
 }
 public static void main(String argv[]) {
   Main pane = new Main();
   for (int n = 1; n <= 4; n += 1) {
       pane.appendNaive(Color.black, String.valueOf(n) + " ");
   }
   JFrame f = new JFrame("ColorPane example");
   f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   f.setContentPane(new JScrollPane(pane));
   f.setSize(600, 400);
   f.setVisible(true);
 }

}</source>





Using StyleConstants class to simplify style sttribute settings

  1. The StyleConstants class is full of helper methods to simplify setting attribute sets.
  2. Instead of calling the following to make the SimpleAttributeSet both bold and italic:



   <source lang="java">

attributes.addAttribute(StyleConstants.CharacterConstants.Bold, Boolean.TRUE) attributes.addAttribute(StyleConstants.CharacterConstants.Italic, Boolean.TRUE)</source>