Java by API — различия между версиями
Admin (обсуждение | вклад) м (1 версия) |
|
(нет различий)
|
Текущая версия на 17:49, 31 мая 2010
- com.sun.image.codec.jpeg
- java.applet
- java.awt
- java.awt.datatransfer
- java.awt.dnd
- java.awt.event
- java.awt.geom
- java.awt.im.spi
- java.awt.image
- java.awt.print
- java.beans
- java.beans.beancontext
- java.io
- java.lang
- java.lang.annotation
- java.lang.instrument
- java.lang.management
- java.lang.ref
- java.lang.reflect
- java.math
- java.net
- java.nio
- java.nio.channels
- java.nio.charset
- java.rmi.dgc
- java.rmi.server
- java.security
- java.security.cert
- java.security.spec
- java.sql
- java.text
- java.text.spi
- java.util
- java.util.concurrent
- java.util.concurrent.atomic
- java.util.concurrent.locks
- java.util.jar
- java.util.logging
- java.util.prefs
- java.util.regex
- java.util.spi
- java.util.zip
- javax.accessibility
- javax.activation
- javax.annotation.security
- javax.comm
- javax.crypto
- javax.crypto.spec
- javax.ejb
- javax.imageio
- javax.imageio.event
- javax.jws
- javax.mail
- javax.mail.internet
- javax.media.jai
- javax.microedition.io
- javax.microedition.lcdui
- javax.microedition.media
- javax.microedition.media.control
- javax.microedition.midlet
- javax.microedition.pim
- javax.microedition.rms
- javax.naming
- javax.naming.directory
- javax.naming.event
- javax.naming.ldap
- javax.naming.spi
- javax.net
- javax.net.ssl
- javax.persistence
- javax.print
- javax.print.attribute
- javax.print.attribute.standard
- javax.print.event
- javax.script
- javax.servlet
- javax.servlet.http
- javax.sound.midi
- javax.sound.sampled
- javax.sql
- javax.sql.rowset
- javax.swing
- javax.swing.border
- javax.swing.colorchooser
- javax.swing.event
- javax.swing.filechooser
- javax.swing.plaf.basic
- javax.swing.plaf.metal
- javax.swing.plaf.synth
- javax.swing.table
- javax.swing.text
- javax.swing.text.html
- javax.swing.text.html.parser
- javax.swing.text.rtf
- javax.swing.tree
- javax.swing.undo
- javax.tools
- javax.transaction
- javax.xml
- javax.xml.bind
- javax.xml.bind.annotation
- javax.xml.crypto.dsig
- javax.xml.crypto.dsig.keyinfo
- javax.xml.namespace
- javax.xml.parsers
- javax.xml.soap
- javax.xml.stream
- javax.xml.stream.events
- javax.xml.transform
- javax.xml.transform.dom
- javax.xml.transform.stream
- javax.xml.validation
- javax.xml.ws
- javax.xml.xpath
- junit.extensions
- junit.framework
- junit.textui
- org.apache.commons.lang
- org.apache.commons.lang.builder
- org.apache.commons.lang.exception
- org.apache.commons.lang.time
- org.apache.commons.logging
- org.apache.commons.math
- org.eclipse.jface.action
- org.eclipse.jface.dialogs
- org.eclipse.jface.operation
- org.eclipse.jface.viewers
- org.eclipse.jface.window
- org.eclipse.jface.wizard
- org.eclipse.swt
- org.eclipse.swt.browser
- org.eclipse.swt.custom
- org.eclipse.swt.dnd
- org.eclipse.swt.events
- org.eclipse.swt.graphics
- org.eclipse.swt.layout
- org.eclipse.swt.ole.win32
- org.eclipse.swt.printing
- org.eclipse.swt.program
- org.eclipse.swt.widgets
- org.junit
- org.w3c.dom
- org.xml.sax
- org.xml.sax.helpers
- sun.audio
Содержание
- 1 AttributedString: addAttribute(Attribute attribute, Object value)
- 2 GlyphVector: getGlyphOutline(int glyphIndex)
- 3 LineBreakMeasurer: getPosition()
- 4 LineBreakMeasurer: nextLayout(float wrappingWidth)
- 5 LineBreakMeasurer: setPosition(int newPosition)
- 6 LineMetrics: getAscent()
- 7 LineMetrics: getDescent()
- 8 LineMetrics: getLeading()
- 9 new FontRenderContext(AffineTransform tx, boolean isAntiAliased, boolean usesFractionalMetrics)
- 10 new ImageGraphicAttribute(Image image, int alignment)
- 11 new LineBreakMeasurer(AttributedCharacterIterator text, FontRenderContext frc)
- 12 new TextLayout(String string, Font font, FontRenderContext frc)
- 13 TextAttribute.FONT
- 14 TextAttribute.FOREGROUND
- 15 TextAttribute.STRIKETHROUGH
- 16 TextAttribute.STRIKETHROUGH_ON
- 17 TextAttribute.UNDERLINE
- 18 TextAttribute.UNDERLINE_ON
- 19 TextHitInfo: getCharIndex()
- 20 TextHitInfo: getInsertionIndex()
- 21 TextHitInfo: isLeadingEdge()
- 22 TextHitInfo: leading(int charIndex)
- 23 TextLayout: draw(Graphics2D g2, float x, float y)
- 24 TextLayout: getAdvance()
- 25 TextLayout: getAscent()
- 26 TextLayout: getDescent()
- 27 TextLayout: getJustifiedLayout(float justificationWidth)
- 28 TextLayout: getLeading()
- 29 TextLayout: getVisibleAdvance()
- 30 TextLayout: hitTestChar(float x, float y)
- 31 TextLayout: isLeftToRight()
AttributedString: addAttribute(Attribute attribute, Object value)
<source lang="java">
import java.awt.Container; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.font.TextAttribute; import java.text.AttributedString; import javax.swing.JComponent; import javax.swing.JFrame; public class MainClass{
public static void main(String[] args) { JFrame jf = new JFrame("Demo"); Container cp = jf.getContentPane(); MyCanvas tl = new MyCanvas(); cp.add(tl); jf.setSize(300, 200); jf.setVisible(true); }
} class MyCanvas extends JComponent {
public void paint(Graphics g) { Graphics2D g2 = (Graphics2D)g; String s = "\"www.jexp.ru,\" www.jexp.ru"; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); Font plainFont = new Font("Times New Roman", Font.PLAIN, 24); AttributedString as = new AttributedString(s); as.addAttribute(TextAttribute.FONT, plainFont); g2.drawString(as.getIterator(), 24, 70); }
}
</source>
GlyphVector: getGlyphOutline(int glyphIndex)
<source lang="java">
import java.awt.Container; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.Shape; import java.awt.font.FontRenderContext; import java.awt.font.GlyphVector; import java.awt.geom.AffineTransform; import java.awt.geom.Point2D; import javax.swing.JComponent; import javax.swing.JFrame; public class MainClass {
public static void main(String[] args) { JFrame jf = new JFrame("Demo"); Container cp = jf.getContentPane(); MyCanvas tl = new MyCanvas(); cp.add(tl); jf.setSize(300, 200); jf.setVisible(true); }
} class MyCanvas extends JComponent {
public void paint(Graphics g) { Graphics2D g2 = (Graphics2D) g; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); String s = "www.jexp.ru www.jexp.ru"; Font font = new Font("Serif", Font.PLAIN, 24); FontRenderContext frc = g2.getFontRenderContext(); g2.translate(40, 80); GlyphVector gv = font.createGlyphVector(frc, s); int length = gv.getNumGlyphs(); for (int i = 0; i < length; i++) { Point2D p = gv.getGlyphPosition(i); double theta = (double) i / (double) (length - 1) * Math.PI / 4; AffineTransform at = AffineTransform.getTranslateInstance(p.getX(), p.getY()); at.rotate(theta); Shape glyph = gv.getGlyphOutline(i); Shape transformedGlyph = at.createTransformedShape(glyph); g2.fill(transformedGlyph); } }
}
</source>
LineBreakMeasurer: getPosition()
<source lang="java">
import java.awt.Container; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.font.FontRenderContext; import java.awt.font.LineBreakMeasurer; import java.awt.font.TextAttribute; import java.awt.font.TextLayout; import java.text.AttributedCharacterIterator; import java.text.AttributedString; import java.util.Hashtable; import javax.swing.JFrame; import javax.swing.JPanel; public class MainClass {
public static void main(String[] args) { JFrame f = new JFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container c = f.getContentPane(); c.add(new Justify()); f.pack(); f.setVisible(true); }
} class Justify extends JPanel {
final static int LEFT = 0; final static int RIGHT = 1; final static int CENTER = 2; final static int EQUALITY = 3; int justify = EQUALITY; public void paint(Graphics g) { Dimension size = getSize(); String s = "To jexp.ru or not to jexp.ru, that is a question"; Hashtable map = new Hashtable(); map.put(TextAttribute.SIZE, new Float(32.0f)); AttributedString as = new AttributedString(s, map); map = new Hashtable(); map.put(TextAttribute.POSTURE, TextAttribute.POSTURE_OBLIQUE); as.addAttributes(map, 33, 52); AttributedCharacterIterator aci = as.getIterator(); int startIndex = aci.getBeginIndex(); int endIndex = aci.getEndIndex(); LineBreakMeasurer measurer; measurer = new LineBreakMeasurer(aci, new FontRenderContext(null, false, false)); measurer.setPosition(startIndex); float wrappingWidth = (float) size.width; float Y = 0.0f; while (measurer.getPosition() < endIndex) { TextLayout layout = measurer.nextLayout(wrappingWidth); Y += layout.getAscent(); float X = 0.0f; switch (justify) { case LEFT: if (layout.isLeftToRight()) X = 0.0f; else X = wrappingWidth - layout.getAdvance(); break; case RIGHT: if (layout.isLeftToRight()) X = wrappingWidth - layout.getVisibleAdvance(); else X = wrappingWidth; break; case CENTER: if (layout.isLeftToRight()) X = (wrappingWidth - layout.getVisibleAdvance()) / 2; else X = (wrappingWidth + layout.getAdvance()) / 2 - layout.getAdvance(); break; case EQUALITY: layout = layout.getJustifiedLayout(wrappingWidth); } layout.draw((Graphics2D) g, X, Y); Y += layout.getDescent() + layout.getLeading(); } }
}
</source>
LineBreakMeasurer: nextLayout(float wrappingWidth)
<source lang="java">
import java.awt.Container; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Point; import java.awt.font.FontRenderContext; import java.awt.font.LineBreakMeasurer; import java.awt.font.TextAttribute; import java.awt.font.TextLayout; import java.text.AttributedString; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import javax.swing.JComponent; import javax.swing.JFrame;
public class MainClass {
public static void main(String[] a) throws Exception { JFrame jf = new JFrame("Demo"); Container cp = jf.getContentPane(); TextFormat tl = new TextFormat(); cp.add(tl); jf.setSize(300, 200); jf.setVisible(true); }
} class TextFormat extends JComponent {
List layouts; Font font = new Font("SansSerif", Font.BOLD, 42); String text = "The quick brown fox jumped over the lazy cow"; public void paint(Graphics g) { if (layouts == null) getLayouts(g); Point pen = new Point(0, 0); Graphics2D g2d = (Graphics2D)g; g2d.setColor(java.awt.Color.black); // or a property g2d.setFont(font); Iterator it = layouts.iterator(); while (it.hasNext()) { TextLayout layout = (TextLayout) it.next(); pen.y += (layout.getAscent()); g2d.setFont(font); layout.draw(g2d, pen.x, pen.y); pen.y += layout.getDescent(); } } private void getLayouts(Graphics g) { layouts = new ArrayList(); Graphics2D g2d = (Graphics2D) g; FontRenderContext frc = g2d.getFontRenderContext(); AttributedString attrStr = new AttributedString(text); attrStr.addAttribute(TextAttribute.FONT, font, 0, text.length()); LineBreakMeasurer measurer = new LineBreakMeasurer( attrStr.getIterator(), frc); float wrappingWidth; wrappingWidth = getSize().width - 15; while (measurer.getPosition() < text.length()) { TextLayout layout = measurer.nextLayout(wrappingWidth); layouts.add(layout); } }
}
</source>
LineBreakMeasurer: setPosition(int newPosition)
<source lang="java">
import java.awt.Container; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.font.FontRenderContext; import java.awt.font.LineBreakMeasurer; import java.awt.font.TextAttribute; import java.awt.font.TextLayout; import java.text.AttributedCharacterIterator; import java.text.AttributedString; import java.util.Hashtable; import javax.swing.JFrame; import javax.swing.JPanel; public class MainClass {
public static void main(String[] args) { JFrame f = new JFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container c = f.getContentPane(); c.add(new Justify()); f.pack(); f.setVisible(true); }
} class Justify extends JPanel {
final static int LEFT = 0; final static int RIGHT = 1; final static int CENTER = 2; final static int EQUALITY = 3; int justify = EQUALITY; public void paint(Graphics g) { Dimension size = getSize(); String s = "To jexp.ru or not to jexp.ru, that is a question"; Hashtable map = new Hashtable(); map.put(TextAttribute.SIZE, new Float(32.0f)); AttributedString as = new AttributedString(s, map); map = new Hashtable(); map.put(TextAttribute.POSTURE, TextAttribute.POSTURE_OBLIQUE); as.addAttributes(map, 33, 52); AttributedCharacterIterator aci = as.getIterator(); int startIndex = aci.getBeginIndex(); int endIndex = aci.getEndIndex(); LineBreakMeasurer measurer; measurer = new LineBreakMeasurer(aci, new FontRenderContext(null, false, false)); measurer.setPosition(startIndex); float wrappingWidth = (float) size.width; float Y = 0.0f; while (measurer.getPosition() < endIndex) { TextLayout layout = measurer.nextLayout(wrappingWidth); Y += layout.getAscent(); float X = 0.0f; switch (justify) { case LEFT: if (layout.isLeftToRight()) X = 0.0f; else X = wrappingWidth - layout.getAdvance(); break; case RIGHT: if (layout.isLeftToRight()) X = wrappingWidth - layout.getVisibleAdvance(); else X = wrappingWidth; break; case CENTER: if (layout.isLeftToRight()) X = (wrappingWidth - layout.getVisibleAdvance()) / 2; else X = (wrappingWidth + layout.getAdvance()) / 2 - layout.getAdvance(); break; case EQUALITY: layout = layout.getJustifiedLayout(wrappingWidth); } layout.draw((Graphics2D) g, X, Y); Y += layout.getDescent() + layout.getLeading(); } }
}
</source>
LineMetrics: getAscent()
<source lang="java">
import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.font.FontRenderContext; import java.awt.font.LineMetrics; import java.awt.geom.Line2D; import javax.swing.JFrame; import javax.swing.JPanel; public class Main extends JPanel{
public void paint(Graphics g) { Graphics2D g2 = (Graphics2D) g; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); Font font = new Font("Serif", Font.PLAIN, 72); g2.setFont(font); String s = "this is a test"; float x = 50, y = 150; // Draw the baseline. FontRenderContext frc = g2.getFontRenderContext(); float width = (float) font.getStringBounds(s, frc).getWidth(); Line2D baseline = new Line2D.Float(x, y, x + width, y); g2.setPaint(Color.red); g2.draw(baseline); // Draw the ascent. LineMetrics lm = font.getLineMetrics(s, frc); Line2D ascent = new Line2D.Float(x, y - lm.getAscent(), x + width, y - lm.getAscent()); g2.draw(ascent); // Draw the descent. Line2D descent = new Line2D.Float(x, y + lm.getDescent(), x + width, y + lm.getDescent()); g2.draw(descent); // Draw the leading. Line2D leading = new Line2D.Float(x, y + lm.getDescent() + lm.getLeading(), x + width, y + lm.getDescent() + lm.getLeading()); g2.draw(leading); // Render the string. g2.setPaint(Color.black); g2.drawString(s, x, y); } public static void main(String[] args) { JFrame f = new JFrame(); f.getContentPane().add(new Main()); f.setSize(850, 250); f.setVisible(true); }
}
</source>
LineMetrics: getDescent()
<source lang="java">
import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.font.FontRenderContext; import java.awt.font.LineMetrics; import java.awt.geom.Line2D; import javax.swing.JFrame; import javax.swing.JPanel; public class Main extends JPanel{
public void paint(Graphics g) { Graphics2D g2 = (Graphics2D) g; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); Font font = new Font("Serif", Font.PLAIN, 72); g2.setFont(font); String s = "this is a test"; float x = 50, y = 150; // Draw the baseline. FontRenderContext frc = g2.getFontRenderContext(); float width = (float) font.getStringBounds(s, frc).getWidth(); Line2D baseline = new Line2D.Float(x, y, x + width, y); g2.setPaint(Color.red); g2.draw(baseline); // Draw the ascent. LineMetrics lm = font.getLineMetrics(s, frc); Line2D ascent = new Line2D.Float(x, y - lm.getAscent(), x + width, y - lm.getAscent()); g2.draw(ascent); // Draw the descent. Line2D descent = new Line2D.Float(x, y + lm.getDescent(), x + width, y + lm.getDescent()); g2.draw(descent); // Draw the leading. Line2D leading = new Line2D.Float(x, y + lm.getDescent() + lm.getLeading(), x + width, y + lm.getDescent() + lm.getLeading()); g2.draw(leading); // Render the string. g2.setPaint(Color.black); g2.drawString(s, x, y); } public static void main(String[] args) { JFrame f = new JFrame(); f.getContentPane().add(new Main()); f.setSize(850, 250); f.setVisible(true); }
}
</source>
LineMetrics: getLeading()
<source lang="java">
import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.font.FontRenderContext; import java.awt.font.LineMetrics; import java.awt.geom.Line2D; import javax.swing.JFrame; import javax.swing.JPanel; public class Main extends JPanel{
public void paint(Graphics g) { Graphics2D g2 = (Graphics2D) g; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); Font font = new Font("Serif", Font.PLAIN, 72); g2.setFont(font); String s = "this is a test"; float x = 50, y = 150; // Draw the baseline. FontRenderContext frc = g2.getFontRenderContext(); float width = (float) font.getStringBounds(s, frc).getWidth(); Line2D baseline = new Line2D.Float(x, y, x + width, y); g2.setPaint(Color.red); g2.draw(baseline); // Draw the ascent. LineMetrics lm = font.getLineMetrics(s, frc); Line2D ascent = new Line2D.Float(x, y - lm.getAscent(), x + width, y - lm.getAscent()); g2.draw(ascent); // Draw the descent. Line2D descent = new Line2D.Float(x, y + lm.getDescent(), x + width, y + lm.getDescent()); g2.draw(descent); // Draw the leading. Line2D leading = new Line2D.Float(x, y + lm.getDescent() + lm.getLeading(), x + width, y + lm.getDescent() + lm.getLeading()); g2.draw(leading); // Render the string. g2.setPaint(Color.black); g2.drawString(s, x, y); } public static void main(String[] args) { JFrame f = new JFrame(); f.getContentPane().add(new Main()); f.setSize(850, 250); f.setVisible(true); }
}
</source>
new FontRenderContext(AffineTransform tx, boolean isAntiAliased, boolean usesFractionalMetrics)
<source lang="java">
import java.awt.BasicStroke; import java.awt.Color; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.Shape; import java.awt.font.FontRenderContext; import java.awt.font.TextLayout; import java.awt.geom.AffineTransform; import javax.swing.JFrame; import javax.swing.JPanel; public class Main extends JFrame {
public Main() { getContentPane().add(new DrawingCanvas()); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(500, 500); setVisible(true); } public static void main(String arg[]) { new Main(); }
} class DrawingCanvas extends JPanel {
Font font = new Font("Dialog", Font.BOLD, 40); FontMetrics fontMetrics; DrawingCanvas() { setSize(300, 300); setBackground(Color.white); fontMetrics = getFontMetrics(font); } public void paint(Graphics g) { Graphics2D g2D = (Graphics2D) g; int w = getSize().width; int h = getSize().height; RenderingHints qualityHints = new RenderingHints( RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); qualityHints.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); g2D.setRenderingHints(qualityHints); AffineTransform at = new AffineTransform(); at.setToTranslation(-300, -400); at.shear(-0.5, 0.0); FontRenderContext frc = new FontRenderContext(at, false, false); TextLayout tl = new TextLayout("World!", font, frc); Shape outline = tl.getOutline(null); g2D.setColor(Color.blue); BasicStroke wideStroke = new BasicStroke(2.0f); g2D.setStroke(wideStroke); g2D.draw(outline); }
}
</source>
new ImageGraphicAttribute(Image image, int alignment)
<source lang="java">
import java.awt.Color; import java.awt.Container; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.RenderingHints; import java.awt.font.GraphicAttribute; import java.awt.font.ImageGraphicAttribute; import java.awt.font.TextAttribute; import java.awt.image.BufferedImage; import java.text.AttributedString; import javax.swing.JComponent; import javax.swing.JFrame; public class MainClass {
public static void main(String[] args) { JFrame jf = new JFrame("Demo"); Container cp = jf.getContentPane(); MyCanvas tl = new MyCanvas(); cp.add(tl); jf.setSize(300, 200); jf.setVisible(true); }
} class MyCanvas extends JComponent {
public void paint(Graphics g) { Graphics2D g2 = (Graphics2D) g; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); Font serifFont = new Font("Serif", Font.PLAIN, 32); AttributedString as = new AttributedString("www.jexp.ru"); as.addAttribute(TextAttribute.FONT, serifFont); Image image = createImage(); ImageGraphicAttribute imageAttribute = new ImageGraphicAttribute(image, GraphicAttribute.TOP_ALIGNMENT); as.addAttribute(TextAttribute.CHAR_REPLACEMENT, imageAttribute, 5, 6); g2.drawString(as.getIterator(), 20, 120); } private BufferedImage createImage() { BufferedImage bim; Color[] colors = { Color.red, Color.blue, Color.yellow, }; int width = 8, height = 8; bim = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); Graphics2D g2 = bim.createGraphics(); for (int i = 0; i < width; i++) { g2.setPaint(colors[(i / 2) % colors.length]); g2.drawLine(0, i, i, 0); g2.drawLine(width - i, height, width, height - i); } return bim; }
}
</source>
new LineBreakMeasurer(AttributedCharacterIterator text, FontRenderContext frc)
<source lang="java">
import java.awt.Container; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Point; import java.awt.font.FontRenderContext; import java.awt.font.LineBreakMeasurer; import java.awt.font.TextAttribute; import java.awt.font.TextLayout; import java.text.AttributedString; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import javax.swing.JComponent; import javax.swing.JFrame;
public class MainClass {
public static void main(String[] a) throws Exception { JFrame jf = new JFrame("Demo"); Container cp = jf.getContentPane(); TextFormat tl = new TextFormat(); cp.add(tl); jf.setSize(300, 200); jf.setVisible(true); }
} class TextFormat extends JComponent {
List layouts; Font font = new Font("SansSerif", Font.BOLD, 42); String text = "The quick brown fox jumped over the lazy cow"; public void paint(Graphics g) { if (layouts == null) getLayouts(g); Point pen = new Point(0, 0); Graphics2D g2d = (Graphics2D)g; g2d.setColor(java.awt.Color.black); // or a property g2d.setFont(font); Iterator it = layouts.iterator(); while (it.hasNext()) { TextLayout layout = (TextLayout) it.next(); pen.y += (layout.getAscent()); g2d.setFont(font); layout.draw(g2d, pen.x, pen.y); pen.y += layout.getDescent(); } } private void getLayouts(Graphics g) { layouts = new ArrayList(); Graphics2D g2d = (Graphics2D) g; FontRenderContext frc = g2d.getFontRenderContext(); AttributedString attrStr = new AttributedString(text); attrStr.addAttribute(TextAttribute.FONT, font, 0, text.length()); LineBreakMeasurer measurer = new LineBreakMeasurer( attrStr.getIterator(), frc); float wrappingWidth; wrappingWidth = getSize().width - 15; while (measurer.getPosition() < text.length()) { TextLayout layout = measurer.nextLayout(wrappingWidth); layouts.add(layout); } }
}
</source>
new TextLayout(String string, Font font, FontRenderContext frc)
<source lang="java">
import java.awt.Container; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.font.FontRenderContext; import java.awt.font.TextHitInfo; import java.awt.font.TextLayout; import javax.swing.JComponent; import javax.swing.JFrame; public class MainClass {
public static void main(String[] args) { JFrame jf = new JFrame("Demo"); Container cp = jf.getContentPane(); MyCanvas tl = new MyCanvas(); cp.add(tl); jf.setSize(300, 200); jf.setVisible(true); }
} class MyCanvas extends JComponent {
private TextLayout mTextLayout; private int mX = 40, mY = 80; public MyCanvas() { addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent me) { TextHitInfo hit = mTextLayout.hitTestChar(me.getX() - mX, me.getY() - mY); System.out.println(hit.getCharIndex()); System.out.println(hit.getInsertionIndex()); System.out.println(hit.isLeadingEdge()); } }); } public void paint(Graphics g) { Graphics2D g2 = (Graphics2D) g; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); String s = "www.jexp.ru"; Font font = new Font("Serif", Font.PLAIN, 32); if (mTextLayout == null) { FontRenderContext frc = g2.getFontRenderContext(); mTextLayout = new TextLayout(s, font, frc); } mTextLayout.draw(g2, mX, mY); }
}
</source>
TextAttribute.FONT
<source lang="java">
import java.awt.Color; import java.awt.Container; import java.awt.Dimension; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.font.TextAttribute; import java.text.AttributedString; import javax.swing.JComponent; import javax.swing.JFrame; public class MainClass{
public static void main(String[] args) { JFrame jf = new JFrame("Demo"); Container cp = jf.getContentPane(); MyCanvas tl = new MyCanvas(); cp.add(tl); jf.setSize(300, 200); jf.setVisible(true); }
} class MyCanvas extends JComponent {
public void paint(Graphics g) { Graphics2D g2 = (Graphics2D)g; String s = "www.jexp.ru"; Dimension d = getSize(); g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); Font serifFont = new Font("Serif", Font.PLAIN, 48); Font sansSerifFont = new Font("Monospaced", Font.PLAIN, 48); AttributedString as = new AttributedString(s); as.addAttribute(TextAttribute.FONT, serifFont); as.addAttribute(TextAttribute.FONT, sansSerifFont, 2, 5); as.addAttribute(TextAttribute.FOREGROUND, Color.red, 2, 5); g2.drawString(as.getIterator(), 40, 80); }
}
</source>
TextAttribute.FOREGROUND
<source lang="java">
import java.awt.Color; import java.awt.Container; import java.awt.Dimension; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.font.TextAttribute; import java.text.AttributedString; import javax.swing.JComponent; import javax.swing.JFrame; public class MainClass{
public static void main(String[] args) { JFrame jf = new JFrame("Demo"); Container cp = jf.getContentPane(); MyCanvas tl = new MyCanvas(); cp.add(tl); jf.setSize(300, 200); jf.setVisible(true); }
} class MyCanvas extends JComponent {
public void paint(Graphics g) { Graphics2D g2 = (Graphics2D)g; String s = "www.jexp.ru"; Dimension d = getSize(); g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); Font serifFont = new Font("Serif", Font.PLAIN, 48); Font sansSerifFont = new Font("Monospaced", Font.PLAIN, 48); AttributedString as = new AttributedString(s); as.addAttribute(TextAttribute.FONT, serifFont); as.addAttribute(TextAttribute.FONT, sansSerifFont, 2, 5); as.addAttribute(TextAttribute.FOREGROUND, Color.red, 2, 5); g2.drawString(as.getIterator(), 40, 80); }
}
</source>
TextAttribute.STRIKETHROUGH
<source lang="java">
import java.awt.Container; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.font.TextAttribute; import java.text.AttributedString; import javax.swing.JComponent; import javax.swing.JFrame; public class MainClass{
public static void main(String[] args) { JFrame jf = new JFrame("Demo"); Container cp = jf.getContentPane(); MyCanvas tl = new MyCanvas(); cp.add(tl); jf.setSize(300, 200); jf.setVisible(true); }
} class MyCanvas extends JComponent {
public void paint(Graphics g) { Graphics2D g2 = (Graphics2D)g; String s = "\"www.jexp.ru,\" www.jexp.ru"; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); Font plainFont = new Font("Times New Roman", Font.PLAIN, 24); AttributedString as = new AttributedString(s); as.addAttribute(TextAttribute.FONT, plainFont); as.addAttribute(TextAttribute.STRIKETHROUGH, TextAttribute.STRIKETHROUGH_ON, 18, 22); g2.drawString(as.getIterator(), 24, 70); }
}
</source>
TextAttribute.STRIKETHROUGH_ON
<source lang="java">
import java.awt.Container; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.font.TextAttribute; import java.text.AttributedString; import javax.swing.JComponent; import javax.swing.JFrame; public class MainClass{
public static void main(String[] args) { JFrame jf = new JFrame("Demo"); Container cp = jf.getContentPane(); MyCanvas tl = new MyCanvas(); cp.add(tl); jf.setSize(300, 200); jf.setVisible(true); }
} class MyCanvas extends JComponent {
public void paint(Graphics g) { Graphics2D g2 = (Graphics2D)g; String s = "\"www.jexp.ru,\" www.jexp.ru"; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); Font plainFont = new Font("Times New Roman", Font.PLAIN, 24); AttributedString as = new AttributedString(s); as.addAttribute(TextAttribute.FONT, plainFont); as.addAttribute(TextAttribute.STRIKETHROUGH, TextAttribute.STRIKETHROUGH_ON, 18, 22); g2.drawString(as.getIterator(), 24, 70); }
}
</source>
TextAttribute.UNDERLINE
<source lang="java">
import java.awt.Container; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.font.TextAttribute; import java.text.AttributedString; import javax.swing.JComponent; import javax.swing.JFrame; public class MainClass{
public static void main(String[] args) { JFrame jf = new JFrame("Demo"); Container cp = jf.getContentPane(); MyCanvas tl = new MyCanvas(); cp.add(tl); jf.setSize(300, 200); jf.setVisible(true); }
} class MyCanvas extends JComponent {
public void paint(Graphics g) { Graphics2D g2 = (Graphics2D)g; String s = "\"www.jexp.ru,\" www.jexp.ru"; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); Font plainFont = new Font("Times New Roman", Font.PLAIN, 24); AttributedString as = new AttributedString(s); as.addAttribute(TextAttribute.FONT, plainFont); as.addAttribute(TextAttribute.UNDERLINE, TextAttribute.UNDERLINE_ON, 1, 11); g2.drawString(as.getIterator(), 24, 70); }
}
</source>
TextAttribute.UNDERLINE_ON
<source lang="java">
import java.awt.Container; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.font.TextAttribute; import java.text.AttributedString; import javax.swing.JComponent; import javax.swing.JFrame; public class MainClass{
public static void main(String[] args) { JFrame jf = new JFrame("Demo"); Container cp = jf.getContentPane(); MyCanvas tl = new MyCanvas(); cp.add(tl); jf.setSize(300, 200); jf.setVisible(true); }
} class MyCanvas extends JComponent {
public void paint(Graphics g) { Graphics2D g2 = (Graphics2D)g; String s = "\"www.jexp.ru,\" www.jexp.ru"; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); Font plainFont = new Font("Times New Roman", Font.PLAIN, 24); AttributedString as = new AttributedString(s); as.addAttribute(TextAttribute.FONT, plainFont); as.addAttribute(TextAttribute.UNDERLINE, TextAttribute.UNDERLINE_ON, 1, 11); g2.drawString(as.getIterator(), 24, 70); }
}
</source>
TextHitInfo: getCharIndex()
<source lang="java">
import java.awt.Container; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.font.FontRenderContext; import java.awt.font.TextHitInfo; import java.awt.font.TextLayout; import javax.swing.JComponent; import javax.swing.JFrame; public class MainClass {
public static void main(String[] args) { JFrame jf = new JFrame("Demo"); Container cp = jf.getContentPane(); MyCanvas tl = new MyCanvas(); cp.add(tl); jf.setSize(300, 200); jf.setVisible(true); }
} class MyCanvas extends JComponent {
private TextLayout mTextLayout; private int mX = 40, mY = 80; public MyCanvas() { addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent me) { TextHitInfo hit = mTextLayout.hitTestChar(me.getX() - mX, me.getY() - mY); System.out.println(hit.getCharIndex()); System.out.println(hit.getInsertionIndex()); System.out.println(hit.isLeadingEdge()); } }); } public void paint(Graphics g) { Graphics2D g2 = (Graphics2D) g; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); String s = "www.jexp.ru"; Font font = new Font("Serif", Font.PLAIN, 32); if (mTextLayout == null) { FontRenderContext frc = g2.getFontRenderContext(); mTextLayout = new TextLayout(s, font, frc); } mTextLayout.draw(g2, mX, mY); }
}
</source>
TextHitInfo: getInsertionIndex()
<source lang="java">
import java.awt.Container; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.font.FontRenderContext; import java.awt.font.TextHitInfo; import java.awt.font.TextLayout; import javax.swing.JComponent; import javax.swing.JFrame; public class MainClass {
public static void main(String[] args) { JFrame jf = new JFrame("Demo"); Container cp = jf.getContentPane(); MyCanvas tl = new MyCanvas(); cp.add(tl); jf.setSize(300, 200); jf.setVisible(true); }
} class MyCanvas extends JComponent {
private TextLayout mTextLayout; private int mX = 40, mY = 80; public MyCanvas() { addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent me) { TextHitInfo hit = mTextLayout.hitTestChar(me.getX() - mX, me.getY() - mY); System.out.println(hit.getCharIndex()); System.out.println(hit.getInsertionIndex()); System.out.println(hit.isLeadingEdge()); } }); } public void paint(Graphics g) { Graphics2D g2 = (Graphics2D) g; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); String s = "www.jexp.ru"; Font font = new Font("Serif", Font.PLAIN, 32); if (mTextLayout == null) { FontRenderContext frc = g2.getFontRenderContext(); mTextLayout = new TextLayout(s, font, frc); } mTextLayout.draw(g2, mX, mY); }
}
</source>
TextHitInfo: isLeadingEdge()
<source lang="java">
import java.awt.Container; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.font.FontRenderContext; import java.awt.font.TextHitInfo; import java.awt.font.TextLayout; import javax.swing.JComponent; import javax.swing.JFrame; public class MainClass {
public static void main(String[] args) { JFrame jf = new JFrame("Demo"); Container cp = jf.getContentPane(); MyCanvas tl = new MyCanvas(); cp.add(tl); jf.setSize(300, 200); jf.setVisible(true); }
} class MyCanvas extends JComponent {
private TextLayout mTextLayout; private int mX = 40, mY = 80; public MyCanvas() { addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent me) { TextHitInfo hit = mTextLayout.hitTestChar(me.getX() - mX, me.getY() - mY); System.out.println(hit.getCharIndex()); System.out.println(hit.getInsertionIndex()); System.out.println(hit.isLeadingEdge()); } }); } public void paint(Graphics g) { Graphics2D g2 = (Graphics2D) g; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); String s = "www.jexp.ru"; Font font = new Font("Serif", Font.PLAIN, 32); if (mTextLayout == null) { FontRenderContext frc = g2.getFontRenderContext(); mTextLayout = new TextLayout(s, font, frc); } mTextLayout.draw(g2, mX, mY); }
}
</source>
TextHitInfo: leading(int charIndex)
<source lang="java">
/*
* @(#)CodePointInputMethod.java 1.6 05/11/17 * * Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * -Redistribution of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * -Redistribution in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of Sun Microsystems, Inc. or the names of contributors may * be used to endorse or promote products derived from this software without * specific prior written permission. * * This software is provided "AS IS," without a warranty of any kind. ALL * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING * ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE * OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN") * AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE * AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, * INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY * OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. * * You acknowledge that this software is not designed, licensed or intended * for use in the design, construction, operation or maintenance of any * nuclear facility. */
/*
* @(#)CodePointInputMethod.java 1.6 05/11/17 */
//package com.sun.inputmethods.internal.codepointim; import java.awt.AWTEvent; import java.awt.Rectangle; import java.awt.Toolkit; import java.awt.event.InputMethodEvent; import java.awt.event.KeyEvent; import java.awt.font.TextAttribute; import java.awt.font.TextHitInfo; import java.awt.im.InputMethodHighlight; import java.awt.im.spi.InputMethod; import java.awt.im.spi.InputMethodContext; import java.io.IOException; import java.text.AttributedString; import java.util.Locale; /**
* The Code Point Input Method is a simple input method that allows Unicode * characters to be entered using their code point or code unit values. See the * accompanying file README.txt for more information. * * @author Brian Beck */
public class CodePointInputMethod implements InputMethod {
private static final int UNSET = 0; private static final int ESCAPE = 1; // \u0000 - \uFFFF private static final int SPECIAL_ESCAPE = 2; // \U000000 - \U10FFFF private static final int SURROGATE_PAIR = 3; // \uD800\uDC00 - \uDBFF\uDFFF private InputMethodContext context; private Locale locale; private StringBuffer buffer; private int insertionPoint; private int format = UNSET;
public CodePointInputMethod() throws IOException { } /** * This is the input method"s main routine. The composed text is stored * in buffer. */ public void dispatchEvent(AWTEvent event) { // This input method handles KeyEvent only. if (!(event instanceof KeyEvent)) { return; } KeyEvent e = (KeyEvent) event; int eventID = event.getID(); boolean notInCompositionMode = buffer.length() == 0; if (eventID == KeyEvent.KEY_PRESSED) { // If we are not in composition mode, pass through if (notInCompositionMode) { return; } switch (e.getKeyCode()) { case KeyEvent.VK_LEFT: moveCaretLeft(); break; case KeyEvent.VK_RIGHT: moveCaretRight(); break; } } else if (eventID == KeyEvent.KEY_TYPED) { char c = e.getKeyChar(); // If we are not in composition mode, wait a back slash if (notInCompositionMode) { // If the type character is not a back slash, pass through if (c != "\\") { return; } startComposition(); // Enter to composition mode } else { switch (c) { case " ": // Exit from composition mode finishComposition(); break; case "\u007f": // Delete deleteCharacter(); break; case "\b": // BackSpace deletePreviousCharacter(); break; case "\u001b": // Escape cancelComposition(); break; case "\n": // Return case "\t": // Tab sendCommittedText(); break; default: composeUnicodeEscape(c); break; } } } else { // KeyEvent.KEY_RELEASED // If we are not in composition mode, pass through if (notInCompositionMode) { return; } } e.consume(); } private void composeUnicodeEscape(char c) { switch (buffer.length()) { case 1: // \\ waitEscapeCharacter(c); break; case 2: // \\u or \\U case 3: // \\ux or \\Ux case 4: // \\uxx or \\Uxx waitDigit(c); break; case 5: // \\uxxx or \\Uxxx if (format == SPECIAL_ESCAPE) { waitDigit(c); } else { waitDigit2(c); } break; case 6: // \\uxxxx or \\Uxxxx if (format == SPECIAL_ESCAPE) { waitDigit(c); } else if (format == SURROGATE_PAIR) { waitBackSlashOrLowSurrogate(c); } else { beep(); } break; case 7: // \\Uxxxxx // Only SPECIAL_ESCAPE format uses this state. // Since the second "\\u" of SURROGATE_PAIR format is inserted // automatically, users don"t have to type these keys. waitDigit(c); break; case 8: // \\uxxxx\\u case 9: // \\uxxxx\\ux case 10: // \\uxxxx\\uxx case 11: // \\uxxxx\\uxxx if (format == SURROGATE_PAIR) { waitDigit(c); } else { beep(); } break; default: beep(); break; } } private void waitEscapeCharacter(char c) { if (c == "u" || c == "U") { buffer.append(c); insertionPoint++; sendComposedText(); format = (c == "u") ? ESCAPE : SPECIAL_ESCAPE; } else { if (c != "\\") { buffer.append(c); insertionPoint++; } sendCommittedText(); } } private void waitDigit(char c) { if (Character.digit(c, 16) != -1) { buffer.insert(insertionPoint++, c); sendComposedText(); } else { beep(); } } private void waitDigit2(char c) { if (Character.digit(c, 16) != -1) { buffer.insert(insertionPoint++, c); char codePoint = (char)getCodePoint(buffer, 2, 5); if (Character.isHighSurrogate(codePoint)) { format = SURROGATE_PAIR; buffer.append("\\u"); insertionPoint = 8; } else { format = ESCAPE; } sendComposedText(); } else { beep(); } } private void waitBackSlashOrLowSurrogate(char c) { if (insertionPoint == 6) { if (c == "\\") { buffer.append(c); buffer.append("u"); insertionPoint = 8; sendComposedText(); } else if (Character.digit(c, 16) != -1) { buffer.append("\\u"); buffer.append(c); insertionPoint = 9; sendComposedText(); } else { beep(); } } else { beep(); } } /** * Send the composed text to the client. */ private void sendComposedText() { AttributedString as = new AttributedString(buffer.toString()); as.addAttribute(TextAttribute.INPUT_METHOD_HIGHLIGHT, InputMethodHighlight.SELECTED_RAW_TEXT_HIGHLIGHT); context.dispatchInputMethodEvent( InputMethodEvent.INPUT_METHOD_TEXT_CHANGED, as.getIterator(), 0, TextHitInfo.leading(insertionPoint), null); } /** * Send the committed text to the client. */ private void sendCommittedText() { AttributedString as = new AttributedString(buffer.toString()); context.dispatchInputMethodEvent( InputMethodEvent.INPUT_METHOD_TEXT_CHANGED, as.getIterator(), buffer.length(), TextHitInfo.leading(insertionPoint), null); buffer.setLength(0); insertionPoint = 0; format = UNSET; } /** * Move the insertion point one position to the left in the composed text. * Do not let the caret move to the left of the "\\u" or "\\U". */ private void moveCaretLeft() { int len = buffer.length(); if (--insertionPoint < 2) { insertionPoint++; beep(); } else if (format == SURROGATE_PAIR && insertionPoint == 7) { insertionPoint = 8; beep(); } context.dispatchInputMethodEvent( InputMethodEvent.CARET_POSITION_CHANGED, null, 0, TextHitInfo.leading(insertionPoint), null); } /** * Move the insertion point one position to the right in the composed text. */ private void moveCaretRight() { int len = buffer.length(); if (++insertionPoint > len) { insertionPoint = len; beep(); } context.dispatchInputMethodEvent( InputMethodEvent.CARET_POSITION_CHANGED, null, 0, TextHitInfo.leading(insertionPoint), null); } /** * Delete the character preceding the insertion point in the composed text. * If the insertion point is not at the end of the composed text and the * preceding text is "\\u" or "\\U", ring the bell. */ private void deletePreviousCharacter() { if (insertionPoint == 2) { if (buffer.length() == 2) { cancelComposition(); } else { // Do not allow deletion of the leading "\\u" or "\\U" if there // are other digits in the composed text. beep(); } } else if (insertionPoint == 8) { if (buffer.length() == 8) { if (format == SURROGATE_PAIR) { buffer.deleteCharAt(--insertionPoint); } buffer.deleteCharAt(--insertionPoint); sendComposedText(); } else { // Do not allow deletion of the second "\\u" if there are other // digits in the composed text. beep(); } } else { buffer.deleteCharAt(--insertionPoint); if (buffer.length() == 0) { sendCommittedText(); } else { sendComposedText(); } } } /** * Delete the character following the insertion point in the composed text. * If the insertion point is at the end of the composed text, ring the bell. */ private void deleteCharacter() { if (insertionPoint < buffer.length()) { buffer.deleteCharAt(insertionPoint); sendComposedText(); } else { beep(); } } private void startComposition() { buffer.append("\\"); insertionPoint = 1; sendComposedText(); } private void cancelComposition() { buffer.setLength(0); insertionPoint = 0; sendCommittedText(); } private void finishComposition() { int len = buffer.length(); if (len == 6 && format != SPECIAL_ESCAPE) { char codePoint = (char)getCodePoint(buffer, 2, 5); if (Character.isValidCodePoint(codePoint) && codePoint != 0xFFFF) { buffer.setLength(0); buffer.append(codePoint); sendCommittedText(); return; } } else if (len == 8 && format == SPECIAL_ESCAPE) { int codePoint = getCodePoint(buffer, 2, 7); if (Character.isValidCodePoint(codePoint) && codePoint != 0xFFFF) { buffer.setLength(0); buffer.appendCodePoint(codePoint); sendCommittedText(); return; } } else if (len == 12 && format == SURROGATE_PAIR) { char[] codePoint = { (char)getCodePoint(buffer, 2, 5), (char)getCodePoint(buffer, 8, 11) }; if (Character.isHighSurrogate(codePoint[0]) && Character.isLowSurrogate(codePoint[1])) { buffer.setLength(0); buffer.append(codePoint); sendCommittedText(); return; } } beep(); } private int getCodePoint(StringBuffer sb, int from, int to) { int value = 0; for (int i = from; i <= to; i++) { value = (value<<4) + Character.digit(sb.charAt(i), 16); } return value; } private static void beep() { Toolkit.getDefaultToolkit().beep(); }
public void activate() { if (buffer == null) { buffer = new StringBuffer(12); insertionPoint = 0; } } public void deactivate(boolean isTemporary) { if (!isTemporary) { buffer = null; } } public void dispose() { } public Object getControlObject() { return null; } public void endComposition() { sendCommittedText(); } public Locale getLocale() { return locale; } public void hideWindows() { } public boolean isCompositionEnabled() { // always enabled return true; } public void notifyClientWindowChange(Rectangle location) { } public void reconvert() { // not supported yet throw new UnsupportedOperationException(); } public void removeNotify() { } public void setCharacterSubsets(Character.Subset[] subsets) { } public void setCompositionEnabled(boolean enable) { // not supported yet throw new UnsupportedOperationException(); } public void setInputMethodContext(InputMethodContext context) { this.context = context; } /* * The Code Point Input Method supports all locales. */ public boolean setLocale(Locale locale) { this.locale = locale; return true; }
}
</source>
TextLayout: draw(Graphics2D g2, float x, float y)
<source lang="java">
import java.awt.Container; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.font.TextLayout; import javax.swing.JComponent; import javax.swing.JFrame; public class MainClass{
public static void main(String[] args) { JFrame jf = new JFrame("Demo"); Container cp = jf.getContentPane(); MyCanvas tl = new MyCanvas(); cp.add(tl); jf.setSize(300, 200); jf.setVisible(true); }
} class MyCanvas extends JComponent {
public void paint(Graphics g) { Graphics2D g2 = (Graphics2D)g; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); String s = "www.jexp.ru"; Font font = new Font("Serif", Font.PLAIN, 32); TextLayout textLayout = new TextLayout(s, font, g2.getFontRenderContext()); textLayout.draw(g2, 40, 80); }
}
</source>
TextLayout: getAdvance()
<source lang="java">
import java.awt.Container; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.font.FontRenderContext; import java.awt.font.LineBreakMeasurer; import java.awt.font.TextAttribute; import java.awt.font.TextLayout; import java.text.AttributedCharacterIterator; import java.text.AttributedString; import java.util.Hashtable; import javax.swing.JFrame; import javax.swing.JPanel; public class MainClass {
public static void main(String[] args) { JFrame f = new JFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container c = f.getContentPane(); c.add(new Justify()); f.pack(); f.setVisible(true); }
} class Justify extends JPanel {
final static int LEFT = 0; final static int RIGHT = 1; final static int CENTER = 2; final static int EQUALITY = 3; int justify = EQUALITY; public void paint(Graphics g) { Dimension size = getSize(); String s = "To jexp.ru or not to jexp.ru, that is a question"; Hashtable map = new Hashtable(); map.put(TextAttribute.SIZE, new Float(32.0f)); AttributedString as = new AttributedString(s, map); map = new Hashtable(); map.put(TextAttribute.POSTURE, TextAttribute.POSTURE_OBLIQUE); as.addAttributes(map, 33, 52); AttributedCharacterIterator aci = as.getIterator(); int startIndex = aci.getBeginIndex(); int endIndex = aci.getEndIndex(); LineBreakMeasurer measurer; measurer = new LineBreakMeasurer(aci, new FontRenderContext(null, false, false)); measurer.setPosition(startIndex); float wrappingWidth = (float) size.width; float Y = 0.0f; while (measurer.getPosition() < endIndex) { TextLayout layout = measurer.nextLayout(wrappingWidth); Y += layout.getAscent(); float X = 0.0f; switch (justify) { case LEFT: if (layout.isLeftToRight()) X = 0.0f; else X = wrappingWidth - layout.getAdvance(); break; case RIGHT: if (layout.isLeftToRight()) X = wrappingWidth - layout.getVisibleAdvance(); else X = wrappingWidth; break; case CENTER: if (layout.isLeftToRight()) X = (wrappingWidth - layout.getVisibleAdvance()) / 2; else X = (wrappingWidth + layout.getAdvance()) / 2 - layout.getAdvance(); break; case EQUALITY: layout = layout.getJustifiedLayout(wrappingWidth); } layout.draw((Graphics2D) g, X, Y); Y += layout.getDescent() + layout.getLeading(); } }
}
</source>
TextLayout: getAscent()
<source lang="java">
import java.awt.Container; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Point; import java.awt.font.FontRenderContext; import java.awt.font.LineBreakMeasurer; import java.awt.font.TextAttribute; import java.awt.font.TextLayout; import java.text.AttributedString; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import javax.swing.JComponent; import javax.swing.JFrame;
public class MainClass {
public static void main(String[] a) throws Exception { JFrame jf = new JFrame("Demo"); Container cp = jf.getContentPane(); TextFormat tl = new TextFormat(); cp.add(tl); jf.setSize(300, 200); jf.setVisible(true); }
} class TextFormat extends JComponent {
List layouts; Font font = new Font("SansSerif", Font.BOLD, 42); String text = "The quick brown fox jumped over the lazy cow"; public void paint(Graphics g) { if (layouts == null) getLayouts(g); Point pen = new Point(0, 0); Graphics2D g2d = (Graphics2D)g; g2d.setColor(java.awt.Color.black); // or a property g2d.setFont(font); Iterator it = layouts.iterator(); while (it.hasNext()) { TextLayout layout = (TextLayout) it.next(); pen.y += (layout.getAscent()); g2d.setFont(font); layout.draw(g2d, pen.x, pen.y); pen.y += layout.getDescent(); } } private void getLayouts(Graphics g) { layouts = new ArrayList(); Graphics2D g2d = (Graphics2D) g; FontRenderContext frc = g2d.getFontRenderContext(); AttributedString attrStr = new AttributedString(text); attrStr.addAttribute(TextAttribute.FONT, font, 0, text.length()); LineBreakMeasurer measurer = new LineBreakMeasurer( attrStr.getIterator(), frc); float wrappingWidth; wrappingWidth = getSize().width - 15; while (measurer.getPosition() < text.length()) { TextLayout layout = measurer.nextLayout(wrappingWidth); layouts.add(layout); } }
}
</source>
TextLayout: getDescent()
<source lang="java">
import java.awt.Container; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Point; import java.awt.font.FontRenderContext; import java.awt.font.LineBreakMeasurer; import java.awt.font.TextAttribute; import java.awt.font.TextLayout; import java.text.AttributedString; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import javax.swing.JComponent; import javax.swing.JFrame;
public class MainClass {
public static void main(String[] a) throws Exception { JFrame jf = new JFrame("Demo"); Container cp = jf.getContentPane(); TextFormat tl = new TextFormat(); cp.add(tl); jf.setSize(300, 200); jf.setVisible(true); }
} class TextFormat extends JComponent {
List layouts; Font font = new Font("SansSerif", Font.BOLD, 42); String text = "The quick brown fox jumped over the lazy cow"; public void paint(Graphics g) { if (layouts == null) getLayouts(g); Point pen = new Point(0, 0); Graphics2D g2d = (Graphics2D)g; g2d.setColor(java.awt.Color.black); // or a property g2d.setFont(font); Iterator it = layouts.iterator(); while (it.hasNext()) { TextLayout layout = (TextLayout) it.next(); pen.y += (layout.getAscent()); g2d.setFont(font); layout.draw(g2d, pen.x, pen.y); pen.y += layout.getDescent(); } } private void getLayouts(Graphics g) { layouts = new ArrayList(); Graphics2D g2d = (Graphics2D) g; FontRenderContext frc = g2d.getFontRenderContext(); AttributedString attrStr = new AttributedString(text); attrStr.addAttribute(TextAttribute.FONT, font, 0, text.length()); LineBreakMeasurer measurer = new LineBreakMeasurer( attrStr.getIterator(), frc); float wrappingWidth; wrappingWidth = getSize().width - 15; while (measurer.getPosition() < text.length()) { TextLayout layout = measurer.nextLayout(wrappingWidth); layouts.add(layout); } }
}
</source>
TextLayout: getJustifiedLayout(float justificationWidth)
<source lang="java">
import java.awt.Container; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.font.FontRenderContext; import java.awt.font.LineBreakMeasurer; import java.awt.font.TextAttribute; import java.awt.font.TextLayout; import java.text.AttributedCharacterIterator; import java.text.AttributedString; import java.util.Hashtable; import javax.swing.JFrame; import javax.swing.JPanel; public class MainClass {
public static void main(String[] args) { JFrame f = new JFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container c = f.getContentPane(); c.add(new Justify()); f.pack(); f.setVisible(true); }
} class Justify extends JPanel {
final static int LEFT = 0; final static int RIGHT = 1; final static int CENTER = 2; final static int EQUALITY = 3; int justify = EQUALITY; public void paint(Graphics g) { Dimension size = getSize(); String s = "To jexp.ru or not to jexp.ru, that is a question"; Hashtable map = new Hashtable(); map.put(TextAttribute.SIZE, new Float(32.0f)); AttributedString as = new AttributedString(s, map); map = new Hashtable(); map.put(TextAttribute.POSTURE, TextAttribute.POSTURE_OBLIQUE); as.addAttributes(map, 33, 52); AttributedCharacterIterator aci = as.getIterator(); int startIndex = aci.getBeginIndex(); int endIndex = aci.getEndIndex(); LineBreakMeasurer measurer; measurer = new LineBreakMeasurer(aci, new FontRenderContext(null, false, false)); measurer.setPosition(startIndex); float wrappingWidth = (float) size.width; float Y = 0.0f; while (measurer.getPosition() < endIndex) { TextLayout layout = measurer.nextLayout(wrappingWidth); Y += layout.getAscent(); float X = 0.0f; switch (justify) { case LEFT: if (layout.isLeftToRight()) X = 0.0f; else X = wrappingWidth - layout.getAdvance(); break; case RIGHT: if (layout.isLeftToRight()) X = wrappingWidth - layout.getVisibleAdvance(); else X = wrappingWidth; break; case CENTER: if (layout.isLeftToRight()) X = (wrappingWidth - layout.getVisibleAdvance()) / 2; else X = (wrappingWidth + layout.getAdvance()) / 2 - layout.getAdvance(); break; case EQUALITY: layout = layout.getJustifiedLayout(wrappingWidth); } layout.draw((Graphics2D) g, X, Y); Y += layout.getDescent() + layout.getLeading(); } }
}
</source>
TextLayout: getLeading()
<source lang="java">
import java.awt.Container; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.font.FontRenderContext; import java.awt.font.LineBreakMeasurer; import java.awt.font.TextAttribute; import java.awt.font.TextLayout; import java.text.AttributedCharacterIterator; import java.text.AttributedString; import java.util.Hashtable; import javax.swing.JFrame; import javax.swing.JPanel; public class MainClass {
public static void main(String[] args) { JFrame f = new JFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container c = f.getContentPane(); c.add(new Justify()); f.pack(); f.setVisible(true); }
} class Justify extends JPanel {
final static int LEFT = 0; final static int RIGHT = 1; final static int CENTER = 2; final static int EQUALITY = 3; int justify = EQUALITY; public void paint(Graphics g) { Dimension size = getSize(); String s = "To jexp.ru or not to jexp.ru, that is a question"; Hashtable map = new Hashtable(); map.put(TextAttribute.SIZE, new Float(32.0f)); AttributedString as = new AttributedString(s, map); map = new Hashtable(); map.put(TextAttribute.POSTURE, TextAttribute.POSTURE_OBLIQUE); as.addAttributes(map, 33, 52); AttributedCharacterIterator aci = as.getIterator(); int startIndex = aci.getBeginIndex(); int endIndex = aci.getEndIndex(); LineBreakMeasurer measurer; measurer = new LineBreakMeasurer(aci, new FontRenderContext(null, false, false)); measurer.setPosition(startIndex); float wrappingWidth = (float) size.width; float Y = 0.0f; while (measurer.getPosition() < endIndex) { TextLayout layout = measurer.nextLayout(wrappingWidth); Y += layout.getAscent(); float X = 0.0f; switch (justify) { case LEFT: if (layout.isLeftToRight()) X = 0.0f; else X = wrappingWidth - layout.getAdvance(); break; case RIGHT: if (layout.isLeftToRight()) X = wrappingWidth - layout.getVisibleAdvance(); else X = wrappingWidth; break; case CENTER: if (layout.isLeftToRight()) X = (wrappingWidth - layout.getVisibleAdvance()) / 2; else X = (wrappingWidth + layout.getAdvance()) / 2 - layout.getAdvance(); break; case EQUALITY: layout = layout.getJustifiedLayout(wrappingWidth); } layout.draw((Graphics2D) g, X, Y); Y += layout.getDescent() + layout.getLeading(); } }
}
</source>
TextLayout: getVisibleAdvance()
<source lang="java">
import java.awt.Container; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.font.FontRenderContext; import java.awt.font.LineBreakMeasurer; import java.awt.font.TextAttribute; import java.awt.font.TextLayout; import java.text.AttributedCharacterIterator; import java.text.AttributedString; import java.util.Hashtable; import javax.swing.JFrame; import javax.swing.JPanel; public class MainClass {
public static void main(String[] args) { JFrame f = new JFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container c = f.getContentPane(); c.add(new Justify()); f.pack(); f.setVisible(true); }
} class Justify extends JPanel {
final static int LEFT = 0; final static int RIGHT = 1; final static int CENTER = 2; final static int EQUALITY = 3; int justify = EQUALITY; public void paint(Graphics g) { Dimension size = getSize(); String s = "To jexp.ru or not to jexp.ru, that is a question"; Hashtable map = new Hashtable(); map.put(TextAttribute.SIZE, new Float(32.0f)); AttributedString as = new AttributedString(s, map); map = new Hashtable(); map.put(TextAttribute.POSTURE, TextAttribute.POSTURE_OBLIQUE); as.addAttributes(map, 33, 52); AttributedCharacterIterator aci = as.getIterator(); int startIndex = aci.getBeginIndex(); int endIndex = aci.getEndIndex(); LineBreakMeasurer measurer; measurer = new LineBreakMeasurer(aci, new FontRenderContext(null, false, false)); measurer.setPosition(startIndex); float wrappingWidth = (float) size.width; float Y = 0.0f; while (measurer.getPosition() < endIndex) { TextLayout layout = measurer.nextLayout(wrappingWidth); Y += layout.getAscent(); float X = 0.0f; switch (justify) { case LEFT: if (layout.isLeftToRight()) X = 0.0f; else X = wrappingWidth - layout.getAdvance(); break; case RIGHT: if (layout.isLeftToRight()) X = wrappingWidth - layout.getVisibleAdvance(); else X = wrappingWidth; break; case CENTER: if (layout.isLeftToRight()) X = (wrappingWidth - layout.getVisibleAdvance()) / 2; else X = (wrappingWidth + layout.getAdvance()) / 2 - layout.getAdvance(); break; case EQUALITY: layout = layout.getJustifiedLayout(wrappingWidth); } layout.draw((Graphics2D) g, X, Y); Y += layout.getDescent() + layout.getLeading(); } }
}
</source>
TextLayout: hitTestChar(float x, float y)
<source lang="java">
import java.awt.Container; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.font.FontRenderContext; import java.awt.font.TextHitInfo; import java.awt.font.TextLayout; import javax.swing.JComponent; import javax.swing.JFrame; public class MainClass {
public static void main(String[] args) { JFrame jf = new JFrame("Demo"); Container cp = jf.getContentPane(); MyCanvas tl = new MyCanvas(); cp.add(tl); jf.setSize(300, 200); jf.setVisible(true); }
} class MyCanvas extends JComponent {
private TextLayout mTextLayout; private int mX = 40, mY = 80; public MyCanvas() { addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent me) { TextHitInfo hit = mTextLayout.hitTestChar(me.getX() - mX, me.getY() - mY); System.out.println(hit.getCharIndex()); System.out.println(hit.getInsertionIndex()); System.out.println(hit.isLeadingEdge()); } }); } public void paint(Graphics g) { Graphics2D g2 = (Graphics2D) g; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); String s = "www.jexp.ru"; Font font = new Font("Serif", Font.PLAIN, 32); if (mTextLayout == null) { FontRenderContext frc = g2.getFontRenderContext(); mTextLayout = new TextLayout(s, font, frc); } mTextLayout.draw(g2, mX, mY); }
}
</source>
TextLayout: isLeftToRight()
<source lang="java">
import java.awt.Container; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.font.FontRenderContext; import java.awt.font.LineBreakMeasurer; import java.awt.font.TextAttribute; import java.awt.font.TextLayout; import java.text.AttributedCharacterIterator; import java.text.AttributedString; import java.util.Hashtable; import javax.swing.JFrame; import javax.swing.JPanel; public class MainClass {
public static void main(String[] args) { JFrame f = new JFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container c = f.getContentPane(); c.add(new Justify()); f.pack(); f.setVisible(true); }
} class Justify extends JPanel {
final static int LEFT = 0; final static int RIGHT = 1; final static int CENTER = 2; final static int EQUALITY = 3; int justify = EQUALITY; public void paint(Graphics g) { Dimension size = getSize(); String s = "To jexp.ru or not to jexp.ru, that is a question"; Hashtable map = new Hashtable(); map.put(TextAttribute.SIZE, new Float(32.0f)); AttributedString as = new AttributedString(s, map); map = new Hashtable(); map.put(TextAttribute.POSTURE, TextAttribute.POSTURE_OBLIQUE); as.addAttributes(map, 33, 52); AttributedCharacterIterator aci = as.getIterator(); int startIndex = aci.getBeginIndex(); int endIndex = aci.getEndIndex(); LineBreakMeasurer measurer; measurer = new LineBreakMeasurer(aci, new FontRenderContext(null, false, false)); measurer.setPosition(startIndex); float wrappingWidth = (float) size.width; float Y = 0.0f; while (measurer.getPosition() < endIndex) { TextLayout layout = measurer.nextLayout(wrappingWidth); Y += layout.getAscent(); float X = 0.0f; switch (justify) { case LEFT: if (layout.isLeftToRight()) X = 0.0f; else X = wrappingWidth - layout.getAdvance(); break; case RIGHT: if (layout.isLeftToRight()) X = wrappingWidth - layout.getVisibleAdvance(); else X = wrappingWidth; break; case CENTER: if (layout.isLeftToRight()) X = (wrappingWidth - layout.getVisibleAdvance()) / 2; else X = (wrappingWidth + layout.getAdvance()) / 2 - layout.getAdvance(); break; case EQUALITY: layout = layout.getJustifiedLayout(wrappingWidth); } layout.draw((Graphics2D) g, X, Y); Y += layout.getDescent() + layout.getLeading(); } }
}
</source>