为什么Graphics2D.setStoke()不适用于Graphics2D.drawString?

我希望字符串具有不同的宽度,以便我设置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 ,例如……

抚摸

 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(); } } }