Java Tutorial/2D Graphics/TextLayout
Содержание
Drawing a Paragraph of Text
<source lang="java">
import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.font.LineBreakMeasurer; import java.awt.font.TextLayout; import java.text.AttributedString; import javax.swing.JFrame; import javax.swing.JPanel; public class BasicShapes extends JPanel {
public void paint(Graphics g) { Graphics2D g2d = (Graphics2D) g; drawParagraph(g2d, "adfasdfaf", 20); } void drawParagraph(Graphics2D g, String paragraph, float width) { LineBreakMeasurer linebreaker = new LineBreakMeasurer(new AttributedString(paragraph) .getIterator(), g.getFontRenderContext()); float y = 0.0f; while (linebreaker.getPosition() < paragraph.length()) { TextLayout tl = linebreaker.nextLayout(width); y += tl.getAscent(); tl.draw(g, 0, y); y += tl.getDescent() + tl.getLeading(); } } public static void main(String[] args) { JFrame frame = new JFrame("Basic Shapes"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(new BasicShapes()); frame.setSize(350, 250); frame.setLocationRelativeTo(null); frame.setVisible(true); }
}</source>
Drawing Text with Mixed Styles
<source lang="java">
import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.font.TextAttribute; import java.awt.font.TextLayout; import java.text.AttributedString; import javax.swing.JFrame; import javax.swing.JPanel; public class BasicShapes extends JPanel {
public void paint(Graphics g) { Graphics2D g2d = (Graphics2D) g; int x = 10, y = 10, start = 2, end = 4; AttributedString astr = new AttributedString("aString"); astr.addAttribute(TextAttribute.FONT, new Font("", 1, 1), start, end); astr.addAttribute(TextAttribute.BACKGROUND, Color.red, start, end); // Draw mixed-style text TextLayout tl = new TextLayout(astr.getIterator(), g2d.getFontRenderContext()); tl.draw(g2d, x, y); } public static void main(String[] args) { JFrame frame = new JFrame("Basic Shapes"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(new BasicShapes()); frame.setSize(350, 250); frame.setLocationRelativeTo(null); frame.setVisible(true); }
}</source>
Draw text with TextLayout
<source lang="java">
import java.awt.Color; import java.awt.Dimension; 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.TextLayout; import javax.swing.JFrame; import javax.swing.JPanel; public class Main extends JPanel {
public Main() { setBackground(Color.white); } public void paint(Graphics g) { Graphics2D g2D; g2D = (Graphics2D) g; g2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2D.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); FontRenderContext frc = g2D.getFontRenderContext(); Font font1 = new Font("Courier", Font.BOLD, 24); String str1 = new String("Java"); TextLayout tl = new TextLayout(str1, font1, frc); g2D.setColor(Color.gray); tl.draw(g2D, 50, 150); } public static void main(String s[]) { JFrame frame1 = new JFrame("2D Text"); frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame1.getContentPane().add("Center", new Main()); frame1.pack(); frame1.setSize(new Dimension(500, 300)); frame1.setVisible(true); }
}</source>
Getting the Shape from the Outline of Text
<source lang="java">
import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Shape; import java.awt.font.FontRenderContext; import java.awt.font.TextLayout; import javax.swing.JFrame; import javax.swing.JPanel; public class BasicShapes extends JPanel {
public void paint(Graphics g) { Graphics2D g2d = (Graphics2D) g; getTextShape(g2d, "asdf", new Font("", 1, 1)); } public Shape getTextShape(Graphics2D g2d, String str, Font font) { FontRenderContext frc = g2d.getFontRenderContext(); TextLayout tl = new TextLayout(str, font, frc); return tl.getOutline(null); } public static void main(String[] args) { JFrame frame = new JFrame("Basic Shapes"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(new BasicShapes()); frame.setSize(350, 250); frame.setLocationRelativeTo(null); frame.setVisible(true); }
}</source>
Make your own animation from a series of images
<source lang="java">
import java.awt.BorderLayout; import java.awt.Graphics; import java.awt.MediaTracker; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.Timer; public class Main extends JPanel implements ActionListener {
ImageIcon images[]; int totalImages = 30, currentImage = 0, animationDelay = 50; Timer animationTimer; public Main() { images = new ImageIcon[totalImages]; for (int i = 0; i < images.length; ++i) images[i] = new ImageIcon("images/java" + i + ".gif"); startAnimation(); } public void paintComponent(Graphics g) { super.paintComponent(g); if (images[currentImage].getImageLoadStatus() == MediaTracker.ruPLETE) { images[currentImage].paintIcon(this, g, 0, 0); currentImage = (currentImage + 1) % totalImages; } } public void actionPerformed(ActionEvent e) { repaint(); } public void startAnimation() { if (animationTimer == null) { currentImage = 0; animationTimer = new Timer(animationDelay, this); animationTimer.start(); } else if (!animationTimer.isRunning()) animationTimer.restart(); } public void stopAnimation() { animationTimer.stop(); } public static void main(String args[]) { Main anim = new Main(); JFrame app = new JFrame("Animator test"); app.add(anim, BorderLayout.CENTER); app.setSize(300,300); app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); app.setSize(anim.getPreferredSize().width + 10, anim.getPreferredSize().height + 30); }
}</source>
Styled Text
<source lang="java">
import java.awt.Canvas; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.font.FontRenderContext; import java.awt.font.TextLayout; import javax.swing.JFrame; public class Draw2DTextLayout extends JFrame {
public static void main(String args[]) { Draw2DTextLayout app = new Draw2DTextLayout(); } public Draw2DTextLayout() { add("Center", new MyCanvas()); setSize(400, 400); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); } class MyCanvas extends Canvas { public void paint(Graphics graphics) { Graphics2D g = (Graphics2D) graphics; FontRenderContext frc = g.getFontRenderContext(); TextLayout[] s = new TextLayout[3]; Font f1 = new Font("Helvetica", Font.BOLD, 24); Font f2 = new Font("TimesRoman", Font.ITALIC, 14); Font f3 = new Font("Helvetica", Font.PLAIN, 12); s[0] = new TextLayout("This is the first sentence.", f1, frc); s[1] = new TextLayout("This is the second sentence.", f2, frc); s[2] = new TextLayout("This is the third sentence.", f3, frc); int yOffset = 0; for (int i = 0; i < s.length; ++i) { s[i].draw(g, 100, 100 + yOffset); yOffset += s[i].getAscent() + s[i].getDescent() + s[i].getLeading(); } } }
}</source>
Text Layout with mouse clicking and selecting action
<source lang="java">
import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Shape; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionAdapter; import java.awt.font.FontRenderContext; import java.awt.font.TextHitInfo; import java.awt.font.TextLayout; import java.awt.geom.AffineTransform; import java.awt.geom.Rectangle2D; import javax.swing.JFrame; import javax.swing.JPanel; public class TextLayoutWithMouseClickDrag{
public static void main(String arg[]) { JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add("Center", new DisplayPanel()); frame.pack(); frame.setSize(new Dimension(400, 300)); frame.setVisible(true); }
} class DisplayPanel extends JPanel {
FontRenderContext frc = new FontRenderContext(null, false, false); Font font = new Font("Arial", Font.PLAIN, 36); Rectangle2D rect; float rx, ry, rw, rh; TextHitInfo hitInfo; Color caretColor; int hit1, hit2; int w=400, h=200; TextLayout layout = new TextLayout("j a v a 2 s . c o m", font, frc); public DisplayPanel() { setSize(400, 200); addMouseListener(new MouseHandler()); addMouseMotionListener(new MouseMotionHandler()); rx = (float) (w / 2 - layout.getBounds().getWidth() / 2); ry = (float) 3 * h / 4; rw = (float) (layout.getBounds().getWidth()); rh = (float) (layout.getBounds().getHeight()); rect = new Rectangle2D.Float(rx, ry, rw, rh); } public void update(Graphics g) { g.clearRect(0, 0, getWidth(), getHeight()); paintComponent(g); } public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D) g; AffineTransform at = AffineTransform.getTranslateInstance(rx, ry); Shape hilight = layout.getLogicalHighlightShape(hit1, hit2); hilight = at.createTransformedShape(hilight); g2.setColor(Color.lightGray); g2.fill(hilight); g2.setColor(Color.black); layout.draw(g2, rx, ry); Shape[] caretShapes = layout.getCaretShapes(hit1); Shape caret = at.createTransformedShape(caretShapes[0]); g2.setColor(caretColor); g2.draw(caret); } public int getHitLocation(int mouseX, int mouseY) { hitInfo = layout.hitTestChar(mouseX, mouseY, rect); return hitInfo.getInsertionIndex(); } class MouseHandler extends MouseAdapter { public void mouseClicked(MouseEvent e) { caretColor = getForeground(); hit1 = getHitLocation(e.getX(), e.getY()); hit2 = hit1; repaint(); } public void mousePressed(MouseEvent e) { caretColor = getForeground(); hit1 = getHitLocation(e.getX(), e.getY()); hit2 = hit1; repaint(); } public void mouseReleased(MouseEvent e) { hit2 = getHitLocation(e.getX(), e.getY()); repaint(); } } class MouseMotionHandler extends MouseMotionAdapter { public void mouseDragged(MouseEvent e) { caretColor = getBackground(); hit2 = getHitLocation(e.getX(), e.getY()); repaint(); } }
}</source>