2014-03-12 64 views
2

我試圖找到這個短代碼有什麼問題。我無法使用drawString()方法在我的JFrame中打印字符串TEXT。請幫忙 。如果您運行該程序,只會出現純白色的屏幕。無法使用JFrame中的drawString()打印任何字符串

代碼:

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

public class sample extends JFrame 
{ 

    private JPanel panel; 

    public sample() 
    { 
     setSize(500,500); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setVisible(true); 

     panel =new JPanel(); 

     Container mainP= getContentPane(); 
     mainP.add(panel); 
     panel.setBounds(0,0,500,500); 
     panel.setBackground(Color.WHITE); 
    } 

    public void paintComponent(Graphics g) 
    { 
     Graphics2D eg = (Graphics2D)g; 
     eg.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_ON); 
     eg.setColor(Color.BLACK); 
     eg.drawString("TEXT", 40, 120); 
    } 

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

} 

回答

3

JFrame沒有paintComponent方法。所以你不會覆蓋任何東西,而不是繪畫將完成。

關於這一點JPanel確實paintComponent方法,你應該畫上JComponentJPanel,這有方法。您不想在頂層容器上繪畫,如JFrame。 (如果您確實需要知道,則覆蓋的正確方法是paint,對於JFrame)。

也就是說,您還應該在paintComponent方法內調用super.paintComponent,這樣您就不會中斷油漆鏈並留下油漆痕跡。


旁註

  • 是良好實踐,利用@Override註釋的,所以你知道你正確地重寫的方法。你會看到,paintComponent不會覆蓋JFrame的方法之一。

  • setVisible(true)添加您的組件。

  • panel.setBounds(0,0,500,500);會什麼都不做,因爲JFrame有一個默認BorderLayout

  • 關注的Java命名約定,並使用大寫字母類名。

  • 從Event Dispatch Thread運行Swing應用程序。查看`paingComponent`在第二段更在Initial Threads


FINAL

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

public class Sample extends JFrame { 

    private JPanel panel; 

    public Sample() { 
     setSize(500, 500); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 

     panel = new JPanel() { 
      @Override 
      public void paintComponent(Graphics g) { 
       super.paintComponent(g); 
       Graphics2D eg = (Graphics2D) g; 
       eg.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); 
       eg.setColor(Color.BLACK); 
       eg.drawString("TEXT", 40, 120); 
      } 
     }; 

     Container mainP = getContentPane(); 
     mainP.add(panel); 
     panel.setBackground(Color.WHITE); 
     setVisible(true); 
    } 

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

拼寫錯誤。希望我可以+2獲得很好的答案,然後給出額外的建議。 –

+0

謝謝peeskillet。 – ZeroCool

+0

只需接受答案就夠了(複選標記:-) –