2014-07-23 93 views
1

我希望字符串有不同的寬度,使我設置的Graphics2D的行程和代碼是在這裏:爲什麼Graphics2D.setStoke()不適用於Graphics2D.drawString?

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(的新BasicStroke它不工作(10 )); 在此先感謝您的幫助。

+2

因爲'drawString'沒有的概念能夠'衝程' – MadProgrammer

+0

對於一些想法,[檢查此](http://stackoverflow.com/questions/10016001/how-to-draw-an-outline-around-text-in-awt) – MadProgrammer

+0

@MadProgrammer 。謝謝,我會用Font來達到我的目標。 – Gearon

回答

5

基本上,字體/文本使用不同的進程和其他圖形元素呈現,因此它們通常不受諸如筆畫之類的事情的影響。

爲了呈現文本與中風,你需要將其轉換爲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(); 
     } 
    } 

} 
+0

感謝您的出色工作! – Gearon

+0

這實際上是圖形有趣的一面,希望它有幫助 – MadProgrammer

相關問題