2012-08-08 83 views
2

可能重複:
paintComponent() never executes on a JFrame獲得在Swing GUI的空白窗口

我使用下面的代碼dispaly兩個字符串,我直接把他們拉在jfame而不是增加他們的作爲組分或到jpanel.But爲什麼我會得到一個空白的窗口,而不是領Strings.Where我錯了?

import java.awt.Color; 
import java.awt.Container; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 

import javax.swing.JFrame; 
import javax.swing.SwingUtilities; 


public class SimpleAttributes extends JFrame{ 

SimpleAttributes() 
{ 

    super("Simple Attributes"); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setSize(300, 200); 
    //setUndecorated(true); 
    Container cp=this.getContentPane(); 
    cp.setBackground(new Color(0,200,0,0)); 

    setVisible(true); 
} 

public void paintComponent(Graphics g) 
{ 
    Graphics2D g2=(Graphics2D)g.create(); 
    g2.setColor(Color.RED); 
    g2.drawString("One", 10, 10); 

    g.drawString("Two", 10,40); 

} 
public static void main(String[] args) { 
    // TODO Auto-generated method stub 
SwingUtilities.invokeLater(new Runnable(){public void run(){new SimpleAttributes();}}); 
} 

} 

回答

4

JFrame不是一個組件,因此它沒有paintComponent()函數。 See the API documentation

+3

是的。使用'@ Override'註釋的另一個原因。 1+爲好的提升。此外,原始海報應該在JPanel內部繪製,並使用JPanel的「paintComponent(...)」覆蓋,而不是直接在JFrame中繪製。 – 2012-08-08 16:59:03

+0

那麼,有沒有辦法從油漆中繪製這兩個字符串(圖形g) – 2012-08-08 17:01:38

+1

+1好點子:) – 2012-08-08 17:01:51

2

正如前面提到的,上面提到的是不正確的,沒有這樣的方法(我打算快速打字)並考慮JPanels。

你可以做的是建立自己的Container並重寫paint()方法,然後使用它作爲您的ContentPane通過frame.setContentPane(Container con)

import java.awt.Color; 
import java.awt.Container; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 

import javax.swing.JFrame; 
import javax.swing.SwingUtilities; 

public class SimpleAttributes extends JFrame { 

    SimpleAttributes() { 

     super("Simple Attributes"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setSize(300, 200); 
     //setUndecorated(true); 
     setContentPane(new MyContainer()); 
     getContentPane().setBackground(new Color(0, 200, 0, 0)); 

     setVisible(true); 
    } 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     SwingUtilities.invokeLater(new Runnable() { 

      public void run() { 
       new SimpleAttributes(); 
      } 
     }); 
    } 
} 

class MyContainer extends Container { 

    @Override 
    public void paint(Graphics g) { 
     super.paint(g); 
     Graphics2D g2 = (Graphics2D) g.create(); 
     g2.setColor(Color.RED); 
     g2.drawString("One", 10, 10); 
     g.drawString("Two", 10, 40); 
    } 
} 

如在一個答案評論指出,你可以使用paint()JFrame的只是補償對話框的頭的偏移:

import java.awt.Color; 
import java.awt.Container; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 

import javax.swing.JFrame; 
import javax.swing.SwingUtilities; 


public class SimpleAttributes extends JFrame { 

    SimpleAttributes() { 

     super("Simple Attributes"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setSize(300, 200); 
     //setUndecorated(true); 
     getContentPane().setBackground(new Color(0, 200, 0, 0)); 

     setVisible(true); 
    } 

    @Override 
    public void paint(Graphics g) { 
     super.paint(g); 
     Graphics2D g2 = (Graphics2D) g.create(); 
     g2.setColor(Color.RED); 
    g2.drawString("One", 10, 10);//wont show 
     g2.drawString("One", 50, 50);//will show 
     g.drawString("Two", 40, 40);//will show 
    } 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     SwingUtilities.invokeLater(new Runnable() { 

      public void run() { 
       new SimpleAttributes(); 
      } 
     }); 
    } 
} 

的所有多數民衆贊成,但只是想給你更多的麻煩,爲什麼不只是做它首選的方法是什麼? A JPanel和覆蓋paintComponent(Graphics g);

+0

Thanx DavidKroukamp,但是沒有辦法讓我可以在jframe上繪畫並通過內容窗格(通過使內容窗格透明)使其可見。 – 2012-08-08 17:06:45

+0

@Naveen看到後期編輯 – 2012-08-08 17:14:35