java - 为什么 Graphics2D.setStoke() 对 Graphics2D.drawString 不起作用?

标签 java swing fonts awt stroke

我希望字符串具有不同的宽度,以便我设置 Graphics2D 的笔划,代码在这里:

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class StrokeTest {
    public static void main(String[] args) {
        StrokeTest test = new StrokeTest();
        test.createUI();
    }

    public void createUI(){
        JFrame frame = new JFrame();
        frame.add(new MainPanel());
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    @SuppressWarnings("serial")
    class MainPanel extends JPanel{
        public MainPanel(){
            setPreferredSize(new Dimension(400, 300));
        }
        protected void paintComponent(Graphics g){
            Graphics2D g2d = (Graphics2D)g;
            g2d.setColor(Color.red);
            g2d.setStroke(new BasicStroke(10));
            g2d.drawString("I am a string", 100, 100);
        }
    }
}

但是,当我使用 g2d.setStroke(new BasicStroke(10)); 时它不起作用 预先感谢您的帮助。

最佳答案

基本上,字体/文本是使用与其他图形元素不同的过程呈现的,因此它们通常不受笔划等因素的影响。

为了渲染带有笔划的文本,您需要先将其转换为Shape,例如...

Stroked

import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
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 javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TextStroke {

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

    public TextStroke() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            Font font = getFont();
            setFont(font.deriveFont(Font.PLAIN, 80));
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(800, 200);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            int width = getWidth();
            int height = getHeight();

            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                    RenderingHints.VALUE_ANTIALIAS_ON);

            g2d.setRenderingHint(RenderingHints.KEY_RENDERING,
                    RenderingHints.VALUE_RENDER_QUALITY);

            FontRenderContext frc = g2d.getFontRenderContext();
            String s = "Look ma, I'm Stroked";
            TextLayout textTl = new TextLayout(s, getFont(), frc);
            Shape outline = textTl.getOutline(null);

            FontMetrics fm = g2d.getFontMetrics(getFont());
            int x = (getWidth() - outline.getBounds().width) / 2;
            int y = ((getHeight() - outline.getBounds().height) / 2) + fm.getAscent();
            g2d.translate(x, y);

//            Stroke stroke = g2d.getStroke();
            g2d.setColor(Color.BLACK);
            g2d.fill(outline);
            g2d.setStroke(new BasicStroke(5));
            g2d.setColor(Color.RED);
            g2d.draw(outline);
            g2d.dispose();
        }
    }

}

关于java - 为什么 Graphics2D.setStoke() 对 Graphics2D.drawString 不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24904006/

相关文章:

java - Tomcat JDBCRealm 身份验证在部署后不起作用

java - 在规划继承时,是否允许构造函数调用可重写的方法?

java - 访问特定于平台的应用程序数据区域

java - 使用 "Instance"?不止一次

java - 构建一个运行时动态的 GUI

android - 如何检测系统的中文、韩文和英文字体而不分别嵌入一种字体? (Android 和 IOS 上的 AIR 移动版)

css - 如何合并@font-face 和@media 声明?

java - 从 java jar 运行 R 脚本

css - 构建产品不显示字体 - 基本的 webpack init

java - 我必须在哪里初始化处理程序?