2013-03-30 32 views
1

我正在嘗試創建一個JFrame,它顯示從4到24的每個偶數字號的字符串。爲此,我嘗試執行一個for循環,創建一個drawString,它使用每次增加+2字體大小的Font。試圖通過獲得前一個的getHeight()並將其添加到可變值y中來獲得下一個drawString。但是程序運行時JFrame爲空。 我哪裏錯了?沒有出現在JFrame中的循環drawString

import javax.swing.*; 
import java.awt.*; 

public class JFontSizeDemo extends JFrame { 
    int x = 10; 
    int y = 40; 
    int heightOfFont; 
    public void paint(Graphics g) { 
     super.paint(g); 
     for(int size = 4; size <= 24; size += 2) { 
      g.setFont(new Font("Arial", Font.BOLD, size)); 
      g.drawString("Name", x, y); 
      heightOfFont = g.getFontMetrics().getHeight(); 
      y += heightOfFont; 
     } 
    } 
    public static void main(String[] args) { 
      JFontSizeDemo frame = new JFontSizeDemo(); 
      frame.setSize(300, 300); 
      frame.setVisible(true); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 
} 
+1

它適用於我。您使用的是什麼?規格? –

+0

這個[** example **](http://stackoverflow.com/a/10352884/1057230)或許可以解釋一些關於主題的關注。爲此,您需要[** paintImmediately(...)**](http://docs.oracle.com/javase/7/docs/api/javax/swing/JComponent.html#paintImmediately(int,%20int, %20int,%20int)) –

+1

@GagandeepBali你有沒有試過這個代碼?它運行! –

回答

2

不要直接在JFrame上塗漆,這是一個頂級容器。使用JComponentJPanel。覆蓋paintComponent()繪畫而不是paint()

查看Performing Custom Painting教程瞭解更多詳情和示例。

這裏是你的代碼的輕微變形例:

import javax.swing.*; 
import java.awt.*; 

public class FontSizeDemo { 
    private static void createAndShowUI() { 
     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JPanel panel = new JPanel() { 
      @Override 
      protected void paintComponent(Graphics g) { 
       super.paintComponent(g); 
       int y = 0; 
       for(int size = 4; size <= 24; size += 2) { 
        g.setFont(new Font("Arial", Font.BOLD, size)); 
        g.drawString("Name", 0, y); 
        int heightOfFont = g.getFontMetrics().getHeight(); 
        y += heightOfFont; 
       } 
      } 

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

     frame.add(panel); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
     frame.pack(); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       createAndShowUI(); 
      } 
     }); 
    } 
} 

除了引進JPanel繪畫,還有的y快速微小的修正協調,以確保文本保持在重繪後的同一個地方。還有SwingUtilities.invokeLater。另外,通常根本不需要延長JFrame

+3

+1這個很好的例子,實際上保持Access Specifier爲'protected'而不是'public' :-) –

+1

謝謝我得到它的工作。 – Novice

+0

@Novice不客氣! :) – tenorsax