<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # 文字和字體 > 原文: [https://zetcode.com/gfx/java2d/textfonts/](https://zetcode.com/gfx/java2d/textfonts/) 在 Java 2D 教程的這一部分中,我們將使用文本和字體。 ## 文字和字體 渲染文本是另一個復雜的話題。 它很容易填滿一本專門的書。 在這里,我們僅提供一些基本示例。 字符是表示諸如字母,數字或標點符號之類的項目的符號。 字形是用于呈現字符或字符序列的形狀。 在拉丁字母中,字形通常代表一個字符。 在其他書寫系統中,一個字符可能由幾個字形組成,例如?,?,ú,?。 這些是帶有重音符號的拉丁字符。 字體有兩種:物理字體和邏輯字體。 實際的字體是實際的字體庫。 邏輯字體是 Java 平臺定義的五個字體家族:Serif,SansSerif,Monospaced,Dialog 和 DialogInput。 邏輯字體不是實際的字體庫。 Java 運行時環境將邏輯字體名稱映射到物理字體。 可以使用各種字體在窗口上繪制文本。 字體是一組具有特定字體設計和大小的字體字符。 各種字體包括 Helvetica,Georgia,Times 或 Verdana。 具有特定樣式的字形的集合形成字體面。 字體的集合構成字體家族。 (docs.oracle.com,answers.com) ## 系統字體 此控制臺示例將在您的平臺上打印所有可用字體。 `AllFontsEx.java` ```java package com.zetcode; import java.awt.Font; import java.awt.GraphicsEnvironment; public class AllFontsEx { public static void main(String[] args) { GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); Font[] fonts = ge.getAllFonts(); for (Font font : fonts) { System.out.print(font.getFontName() + " : "); System.out.println(font.getFamily()); } } } ``` 我們打印每種已安裝字體的名稱和系列。 ```java GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); ``` 有些對象是特定平臺的典型對象,其中包括字體。 Unix,OS X 和 Windows 平臺上的字體集合有所不同。 `GraphicsEnvironment`類描述特定平臺上可用的`GraphicsDevice`對象和`Font`對象的集合。 ```java Font[] fonts = ge.getAllFonts(); ``` `getAllFonts()`返回`GraphicsEnvironment`中可用的所有字體。 ```java System.out.print(fonts[i].getFontName() + " : "); System.out.println(fonts[i].getFamily()); ``` 字體名稱和字體系列會打印到終端上。 ```java ... URW Bookman L Demi Bold : URW Bookman L URW Bookman L Demi Bold Italic : URW Bookman L URW Bookman L Light : URW Bookman L URW Bookman L Light Italic : URW Bookman L URW Chancery L Medium Italic : URW Chancery L URW Gothic L Book : URW Gothic L URW Gothic L Book Oblique : URW Gothic L URW Gothic L Demi : URW Gothic L URW Gothic L Demi Oblique : URW Gothic L URW Palladio L Bold : URW Palladio L URW Palladio L Bold Italic : URW Palladio L URW Palladio L Italic : URW Palladio L URW Palladio L Roman : URW Palladio L Ubuntu : Ubuntu Ubuntu Bold : Ubuntu Ubuntu Bold Italic : Ubuntu Ubuntu Condensed : Ubuntu Condensed Ubuntu Italic : Ubuntu ... ``` 這是 Ubuntu Linux 上所有字體的摘錄。 ## 靈魂伴侶 在下一個示例中,我們將在面板上顯示一些歌詞。 `SoulmateEx.java` ```java package com.zetcode; import java.awt.EventQueue; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import javax.swing.JFrame; import javax.swing.JPanel; class Surface extends JPanel { private void doDrawing(Graphics g) { Graphics2D g2d = (Graphics2D) g; RenderingHints rh = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); rh.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); g2d.setRenderingHints(rh); g2d.setFont(new Font("Purisa", Font.PLAIN, 13)); g2d.drawString("Most relationships seem so transitory", 20, 30); g2d.drawString("They're all good but not the permanent one", 20, 60); g2d.drawString("Who doesn't long for someone to hold", 20, 90); g2d.drawString("Who knows how to love you without being told", 20, 120); g2d.drawString("Somebody tell me why I'm on my own", 20, 150); g2d.drawString("If there's a soulmate for everyone", 20, 180); } @Override public void paintComponent(Graphics g) { super.paintComponent(g); doDrawing(g); } } public class SoulmateEx extends JFrame { public SoulmateEx() { initUI(); } private void initUI() { setTitle("Soulmate"); add(new Surface()); setSize(420, 250); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLocationRelativeTo(null); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { SoulmateEx ex = new SoulmateEx(); ex.setVisible(true); } }); } } ``` 在此示例中,我們在面板上繪制文本。 我們選擇一種特定的字體類型。 ```java g2d.setFont(new Font("Purisa", Font.PLAIN, 13)); ``` 在這里,我們設置 Purisa 字體類型。 ```java g2d.drawString("Most relationships seem so transitory", 20, 30); ``` `drawString()`方法使用`Graphics2D`上下文中的當前文本屬性狀態來呈現文本。 ![Soulmate](https://img.kancloud.cn/18/e0/18e09aca15b271e9209fa08f80ac5458_420x250.jpg) 圖:靈魂伴侶 ## Unicode 下一個示例演示如何顯示 Unicode 文本。 請注意,在實際應用中,文本將放置在代碼之外的單獨資源中。 ```java $ cat fyodor Фёдор Михайлович Достоевский родился 30 октября (11 ноября) 1821 года в Москве. Был вторым из 7 детей. Отец, Михаил Андреевич, работал в госпитале для бедных. ... ``` 我們有一個名為`fyodor`的文件,其中的文本在西里爾字母中。 ```java $ native2ascii fyodor unicode ``` 我們使用名為`native2ascii`的工具,可以在 jdk 的`bin`目錄中找到該工具。 它將帶有本地編碼字符的文件轉換為帶有 Unicode 編碼字符的文件。 第一個參數是輸入文件,第二個參數是輸出文件。 ```java $ cat unicode \u0424\u0451\u0434\u043e\u0440 \u041c\u0438\u0445\u0430\u0439\u043b\u043e\u0432\u0438\u0447 ... ``` unicode 編碼中的相同文本。 `UnicodeEx.java` ```java package com.zetcode; import java.awt.EventQueue; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import javax.swing.JFrame; import javax.swing.JPanel; class Surface extends JPanel { String sent1 = "\u0424\u0451\u0434\u043e\u0440 \u041c\u0438\u0445" + "\u0430\u0439\u043b\u043e\u0432\u0438\u0447 \u0414\u043e\u0441\u0442" + "\u043e\u0435\u0432\u0441\u043a\u0438\u0439 \u0440\u043e\u0434\u0438" + "\u043b\u0441\u044f 30 \u043e\u043a\u0442\u044f\u0431\u0440\u044f " + "(11 \u043d\u043e\u044f\u0431\u0440\u044f) 1821 \u0433\u043e\u0434" + "\u0430 \u0432 \u041c\u043e\u0441\u043a\u0432\u0435\. "; String sent2 = "\u0411\u044b\u043b \u0432\u0442\u043e\u0440\u044b\u043c " + "\u0438\u0437 7 \u0434\u0435\u0442\u0435\u0439\. \u041e\u0442\u0435\u0446, " + "\u041c\u0438\u0445\u0430\u0438\u043b \u0410\u043d\u0434\u0440\u0435\u0435" + "\u0432\u0438\u0447, \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0432 " + "\u0433\u043e\u0441\u043f\u0438\u0442\u0430\u043b\u0435 \u0434\u043b\u044f " + "\u0431\u0435\u0434\u043d\u044b\u0445."; String sent3 = "\u041c\u0430\u0442\u044c, \u041c\u0430\u0440\u0438\u044f " + "\u0424\u0451\u0434\u043e\u0440\u043e\u0432\u043d\u0430 " + "(\u0432 \u0434\u0435\u0432\u0438\u0447\u0435\u0441\u0442\u0432\u0435 " + "\u041d\u0435\u0447\u0430\u0435\u0432\u0430), \u043f\u0440\u043e\u0438\u0441" + "\u0445\u043e\u0434\u0438\u043b\u0430 \u0438\u0437 \u043a\u0443\u043f\u0435" + "\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0440\u043e\u0434\u0430."; String sent4 = "\u041a\u043e\u0433\u0434\u0430 \u0414\u043e\u0441\u0442" + "\u043e\u0435\u0432\u0441\u043a\u043e\u043c\u0443 \u0431\u044b\u043b\u043e 15 " + "\u043b\u0435\u0442, \u0435\u0433\u043e \u043c\u0430\u0442\u044c " + "\u0443\u043c\u0435\u0440\u043b\u0430 \u043e\u0442 \u0447\u0430\u0445\u043e" + "\u0442\u043a\u0438, \u0438 \u043e\u0442\u0435\u0446 \u043e\u0442\u043f\u0440" + "\u0430\u0432\u0438\u043b"; String sent5 = "\u0441\u0442\u0430\u0440\u0448\u0438\u0445 \u0441\u044b" + "\u043d\u043e\u0432\u0435\u0439, \u0424\u0451\u0434\u043e\u0440\u0430 \u0438 " + "\u041c\u0438\u0445\u0430\u0438\u043b\u0430 (\u0432\u043f\u043e\u0441\u043b" + "\u0435\u0434\u0441\u0442\u0432\u0438\u0438 \u0442\u0430\u043a\u0436\u0435 " + "\u0441\u0442\u0430\u0432\u0448\u0435\u0433\u043e \u043f\u0438\u0441\u0430" + "\u0442\u0435\u043b\u0435\u043c),"; String sent6 = "\u0432 \u043f\u0430\u043d\u0441\u0438\u043e\u043d \u041a. " + "\u0424\. \u041a\u043e\u0441\u0442\u043e\u043c\u0430\u0440\u043e\u0432\u0430 " + "\u0432 \u041f\u0435\u0442\u0435\u0440\u0431\u0443\u0440\u0433\u0435."; private void doDrawing(Graphics g) { Graphics2D g2d = (Graphics2D) g; RenderingHints rh = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); rh.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); g2d.setRenderingHints(rh); g2d.setFont(new Font("Franklin Gothic Medium", Font.PLAIN, 11)); g2d.drawString(sent1, 20, 30); g2d.drawString(sent2, 20, 55); g2d.drawString(sent3, 20, 80); g2d.drawString(sent4, 20, 120); g2d.drawString(sent5, 20, 145); g2d.drawString(sent6, 20, 170); } @Override public void paintComponent(Graphics g) { super.paintComponent(g); doDrawing(g); } } public class UnicodeEx extends JFrame { public UnicodeEx() { initUI(); } private void initUI() { setTitle("Unicode"); add(new Surface()); setSize(550, 230); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLocationRelativeTo(null); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { UnicodeEx ex = new UnicodeEx(); ex.setVisible(true); } }); } } ``` 請注意,文本將超出實際程序中的源代碼范圍。 為了簡化起見,此處將文本保留在源代碼中。 ```java String sent1 = "\u0424\u0451\u0434\u043e\u0440 \u041c\u0438\u0445" + ... ``` 這是第一個 Unicode 句子。 ```java g2d.drawString(sent1, 20, 30); ``` 用`drawString()`方法繪制句子。 ![Unicode](https://img.kancloud.cn/9c/42/9c42d533386c5e2a2c2f8b00cbafd11c_550x230.jpg) 圖:Unicode ## 陰影文字 在下一個示例中,我們創建陰影文本。 通過兩次繪制相同的文本來創建效果。 一個文本用作主體文本,另一個作為陰影。 陰影的文本會稍微移動一點,以淺灰色顯示并模糊。 `ShadowedTextEx.java` ```java package com.zetcode; import java.awt.Color; import java.awt.EventQueue; import java.awt.Font; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.font.TextLayout; import java.awt.image.BufferedImage; import java.awt.image.ConvolveOp; import java.awt.image.Kernel; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; public class ShadowedTextEx extends JFrame { private final int width = 490; private final int height = 150; private final String text = "Disciplin ist macht"; private TextLayout textLayout; public ShadowedTextEx() { initUI(); } private void initUI() { setTitle("Shadowed Text"); BufferedImage image = createImage(); add(new JLabel(new ImageIcon(image))); setSize(490, 150); setLocationRelativeTo(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } private void setRenderingHints(Graphics2D g) { g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); g.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON); } private BufferedImage createImage() { int x = 10; int y = 100; Font font = new Font("Georgia", Font.ITALIC, 50); BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics2D g1d = image.createGraphics(); setRenderingHints(g1d); textLayout = new TextLayout(text, font, g1d.getFontRenderContext()); g1d.setPaint(Color.WHITE); g1d.fillRect(0, 0, width, height); g1d.setPaint(new Color(150, 150, 150)); textLayout.draw(g1d, x+3, y+3); g1d.dispose(); float[] kernel = { 1f / 9f, 1f / 9f, 1f / 9f, 1f / 9f, 1f / 9f, 1f / 9f, 1f / 9f, 1f / 9f, 1f / 9f }; ConvolveOp op = new ConvolveOp(new Kernel(3, 3, kernel), ConvolveOp.EDGE_NO_OP, null); BufferedImage image2 = op.filter(image, null); Graphics2D g2d = image2.createGraphics(); setRenderingHints(g2d); g2d.setPaint(Color.BLACK); textLayout.draw(g2d, x, y); g2d.dispose(); return image2; } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { ShadowedTextEx ex = new ShadowedTextEx(); ex.setVisible(true); } }); } } ``` 這次我們不使用`paintComponent()`方法。 相反,我們繪制成緩沖的圖像。 ```java Font font = new Font("Georgia", Font.ITALIC, 50); ``` 我們選擇斜體格魯吉亞,大小為 50 點。 ```java BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); ``` 我們創建第一個緩沖圖像。 ```java Graphics2D g1d = image.createGraphics(); ``` 從緩沖的圖像創建一個`Graphics2D`對象。 它將用于繪制緩沖圖像。 ```java textLayout = new TextLayout(text, font, g1d.getFontRenderContext()); ``` 我們創建一個`TextLayout`類。 `TextLayout`是樣式字符數據的不可變圖形表示。 它用于對文本和字體進行高級操作。 ```java textLayout.draw(g1d, x+3, y+3); ``` `draw()`方法在指定的`Graphics2D`上下文中的指定位置呈現此`TextLayout`。 第二和第三個參數指定`TextLayout`的原點坐標。 ```java float[] kernel = { 1f / 9f, 1f / 9f, 1f / 9f, 1f / 9f, 1f / 9f, 1f / 9f, 1f / 9f, 1f / 9f, 1f / 9f }; ConvolveOp op = new ConvolveOp(new Kernel(3, 3, kernel), ConvolveOp.EDGE_NO_OP, null); ``` 此操作將產生模糊效果。 該效果用于陰影文本。 ```java BufferedImage image2 = op.filter(image, null); ``` 我們對第一張圖像應用模糊效果,然后將結果復制到第二張緩沖的圖像。 ```java textLayout.draw(g2d, x, y); ``` 此時,`TextLayout`對象中同時包含原始文本和模糊文本。 ![Shadow Text](https://img.kancloud.cn/49/fe/49fe743879df751574c9154879110b32_490x150.jpg) 圖:陰影文字 ## 文字屬性 繪制文本時,我們可以控制其各種屬性。 我們可以使用`Font`,`TextAttributes`和`AttributeString`類修改文本呈現。 `Font`類表示用于呈現文本的字體。 `TextAttribute`類定義用于文本呈現的屬性鍵和屬性值。 最后,`AttributedString`類保存文本和相關的屬性信息。 `TextAttributesEx.java` ```java package com.zetcode; import java.awt.Color; import java.awt.EventQueue; 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.JFrame; import javax.swing.JPanel; class Surface extends JPanel { private final String words = "Valour fate kinship darkness"; private final String java = "Java TM"; private void doDrawing(Graphics g) { Graphics2D g2d = (Graphics2D) g; g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); Font font = new Font("Serif", Font.PLAIN, 40); AttributedString as1 = new AttributedString(words); as1.addAttribute(TextAttribute.FONT, font); as1.addAttribute(TextAttribute.FOREGROUND, Color.red, 0, 6); as1.addAttribute(TextAttribute.UNDERLINE, TextAttribute.UNDERLINE_ON, 7, 11); as1.addAttribute(TextAttribute.BACKGROUND, Color.LIGHT_GRAY, 12, 19); as1.addAttribute(TextAttribute.STRIKETHROUGH, TextAttribute.STRIKETHROUGH_ON, 20, 28); g2d.drawString(as1.getIterator(), 15, 60); AttributedString as2 = new AttributedString(java); as2.addAttribute(TextAttribute.SIZE, 40); as2.addAttribute(TextAttribute.SUPERSCRIPT, TextAttribute.SUPERSCRIPT_SUPER, 5, 7); g2d.drawString(as2.getIterator(), 130, 125); } @Override public void paintComponent(Graphics g) { super.paintComponent(g); doDrawing(g); } } public class TextAttributesEx extends JFrame { public TextAttributesEx() { initUI(); } private void initUI() { add(new Surface()); setSize(620, 190); setTitle("Text attributes"); setLocationRelativeTo(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { TextAttributesEx ex = new TextAttributesEx(); ex.setVisible(true); } }); } } ``` 在我們的示例中,我們演示了各種文本呈現方式。 ```java AttributedString as1 = new AttributedString(words); ``` 我們從`words`字符串中創建一個`AttributeString`。 ```java as1.addAttribute(TextAttribute.FOREGROUND, Color.red, 0, 6); ``` 在這里,我們向`AttributeString`類添加了一個新屬性。 此屬性指定前七個字符將顯示為紅色。 ```java g2d.drawString(as1.getIterator(), 15, 60); ``` 第一個文本繪制在面板上。 因為此刻我們使用`AttributeString`類而不是直接使用字符串,所以我們使用重載的`drawString()`方法,該方法將`AttributedCharacterIterator`實例作為其第一個參數。 ![Text Attributes](https://img.kancloud.cn/37/55/37555fa819c3e670ef000986eddfe191_620x190.jpg) 圖:文本屬性 ## 旋轉文字 在最后一個示例中,我們在面板上顯示了旋轉的文本。 要旋轉文本,我們執行旋轉和平移操作。 如前所述,`glyph`是用于呈現字符的形狀。 因此,在我們的代碼示例中,我們需要獲取文本的所有字形,獲取它們的度量值并對其進行逐一處理。 我們將與幾個重要的類一起工作。 `FontRenderContext`類是正確測量文本所需信息的容器。 `GlyphVector`對象是一個字形的集合,其中包含用于將每個字形放置在變換后的坐標空間中的幾何信息。 `RotatedTextEx.java` ```java package com.zetcode; import java.awt.EventQueue; 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.JFrame; import javax.swing.JPanel; class Surface extends JPanel { private void doDrawing(Graphics g) { Graphics2D g2d = (Graphics2D) g.create(); g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); String s = "ZetCode, tutorials for programmers"; Font font = new Font("Courier", Font.PLAIN, 13); g2d.translate(20, 20); FontRenderContext frc = g2d.getFontRenderContext(); 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 / 3; AffineTransform at = AffineTransform.getTranslateInstance(p.getX(), p.getY()); at.rotate(theta); Shape glyph = gv.getGlyphOutline(i); Shape transformedGlyph = at.createTransformedShape(glyph); g2d.fill(transformedGlyph); } g2d.dispose(); } @Override public void paintComponent(Graphics g) { super.paintComponent(g); doDrawing(g); } } public class RotatedTextEx extends JFrame { public RotatedTextEx() { initUI(); } private void initUI() { add(new Surface()); setTitle("Rotated text"); setSize(450, 300); setLocationRelativeTo(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { RotatedTextEx ex = new RotatedTextEx(); ex.setVisible(true); } }); } } ``` 這是一個旋轉的文本示例。 ```java String s = "ZetCode, tutorials for programmers"; ``` 我們旋轉此文本。 因為文本采用 Latin1 編碼,所以字形以一對一方式對應于字符。 ```java GlyphVector gv = font.createGlyphVector(frc, s); ``` 在這里,我們創建一個`GlyphVector`對象。 `GlyphVector`是字形及其位置的集合。 ```java int length = gv.getNumGlyphs(); ``` 在這里,我們獲得文本的字形數量。 如果將數字打印到控制臺,則得到 34。因此,在本例中,每個字符都是一個字形。 ```java Point2D p = gv.getGlyphPosition(i); ``` 遍歷字形向量時,我們使用`getGlyphPosition()`方法計算字形的位置。 ```java double theta = (double) i / (double) (length - 1) * Math.PI / 3; ``` 我們計算字形旋轉的程度。 ```java AffineTransform at = AffineTransform.getTranslateInstance(p.getX(), p.getY()); at.rotate(theta); ``` 我們進行仿射旋轉變換。 ```java Shape glyph = gv.getGlyphOutline(i); Shape transformedGlyph = at.createTransformedShape(glyph); ``` `getGlyphOutline()`方法返回指定字形的`Shape`。 `createTransformedShape()`方法返回通過仿射變換操作修改的新`Shape`對象。 ```java g2d.fill(transformedGlyph); ``` 最后,我們繪制字形。 ![Rotated text](https://img.kancloud.cn/12/2c/122c19852ed303a98db21d7a5195f04c_450x300.jpg) 圖:旋轉文本 在 Java 2D 教程的這一部分中,我們介紹了文本和字體。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看