2015-11-19 36 views
1

我正在嘗試編寫一個程序,用於顯示每個字體大小從6到20的短語。我創建了一個for循環來增加每次顯示短語時的字體大小和y軸。但是,當我運行該程序時,它只會顯示一次字體大小爲20的短語...我錯過了什麼?在循環中使用字體大小

import javax.swing.*; 
import java.awt.*; 
public class JFontSizes extends JFrame 
{ 
    String phrase = new String("This is a phrase in every font size from 6 through 20!"); 
    int font = 6; 
    int y = 100; 

    public JFontSizes() 
    { 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

    public void paint(Graphics gr) 
    { 
     while(font < 21) 
     { 
     super.paint(gr); 
     Font timesPlain = new Font("Times New Roman",Font.PLAIN, font); 
     gr.setFont(timesPlain); 
     gr.drawString(phrase, 60, y); 
     font++; 
     y = y + 1; 
     }  
     } 

    public static void main(String[]args) 
    { 
     JFontSizes frame = new JFontSizes(); 
     frame.setSize(550,550); 
     frame.setVisible(true); 
    } 
} 
+0

嗯,我會說,它只是發生的非常快。最後的字體大小是20,這就是你所看到的。或者,添加睡眠方法,以便您可以看到它,或者爲每個尺寸使用不同的「字體」元素。 – Mathemats

+0

請參閱編輯以回答問題 –

回答

4

不要叫超級paint方法 while循環,因爲它是清除以前繪製的字符串。在循環之前調用它。

其他問題:

  • 決不一個JFrame內,你正在做畫畫。
  • 而是在JPanel的paintComponent方法內繪製。
  • 並且與上面提到的相同,請在之前調用super.paintComponent(g)while循環。
  • 然後在JFrame中顯示JPanel。
  • 使font和y成爲方法的局部變量。每次執行重繪時,都希望它們重置。

例如,

import java.awt.Dimension; 
import java.awt.Font; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.RenderingHints; 
import javax.swing.*; 

@SuppressWarnings("serial") 
public class FontSizes extends JPanel { 
    private static final String PHRASE = new String("This is a phrase " 
      + "in every font size from 6 through 20!"); 
    private static final int PREF_W = 500; 
    private static final int PREF_H = 400; 
    private static final int GAP = 8; 
    private static final int STARTING_FONT_PTS = 6; 
    private static final int MAX_FONT_PTS = 21; 
    private static final Font STARTING_FONT = new Font("Times New Roman", 
      Font.PLAIN, STARTING_FONT_PTS); 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 

     // let's make fonts appear smoother 
     Graphics2D g2 = (Graphics2D) g; 
     g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, 
       RenderingHints.VALUE_TEXT_ANTIALIAS_ON); 

     int fontPoints = STARTING_FONT_PTS; 
     int y = GAP; 
     Font font = STARTING_FONT; 
     while (fontPoints < MAX_FONT_PTS) { 
      g.setFont(font); 
      // let's space lines based on font height 
      y += g.getFontMetrics().getAscent() + GAP; 
      g.drawString(PHRASE, GAP, y); 
      fontPoints++; 
      font = font.deriveFont((float) fontPoints); 
     } 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     if (isPreferredSizeSet()) { 
      return super.getPreferredSize(); 
     } 
     return new Dimension(PREF_W, PREF_H); 
    } 

    private static void createAndShowGui() { 
     JFrame frame = new JFrame("FontSizes"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(new FontSizes()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       createAndShowGui(); 
      } 
     }); 
    } 
} 
相關問題