2013-12-15 78 views
1

我正在制作一个数字口袋妖怪卡片式的游戏。当我尝试绘制任何图像时,JFrame保持空白。这可能是一个简单的错误,但我一直无法找到解决方案。在Stack Overflow上,我看到很多类似于我的问题,尽管他们的解决方案不适用于我的代码。下面的代码: 对JFrame类:JPanel没有绘画,JFrame保持空白

import javax.swing.JFrame; 


public class Rocks extends JFrame{ 

public Rocks(){ 
    setVisible(true); 
    setTitle("Rocks Card Game"); 
    setSize(1200,297); 
    add(new Display()); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
} 
public static void main(String[] args) { 
    new Rocks(); 
} 

} 

JPanel类的:

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

import javax.swing.ImageIcon; 
import javax.swing.JPanel; 


public class Display extends JPanel{ 
    Image granite; 
    public Display(){ 
     granite = new ImageIcon("C:\\Users\\Raj\\Pictures\\Granite.png").getImage(); 
     setBackground(Color.black); 
    } 
    public void paint(Graphics g){ 
     Graphics2D g2d = (Graphics2D) g; 
     g2d.drawImage(granite,0,0,null); 
    } 
} 
+2

没有必要风俗画。只需使用带有图标的JLabel。 – camickr

+0

很高兴你把它分类。 :) –

回答

2

是否有扩展JFrame,如果你没有的话,就是不要有原因的。它比继承更合适。作为@camickr commnent它不需要自定义绘画,您可以使用JLabel并致电setIcon

public class Rocks{ 

private JFrame frame; 

public Rocks(){ 
    frame = new JFrame(); 
    frame.setTitle("Rocks Card Game"); 
    frame.setSize(1200,297); 
    //frame.add(new Display()); 
    //as camickr comment 
    JLabel label = new JLabel(new ImageIcon("C:\\Users\\Raj\\Pictures\\Granite.png")); 
    frame.add(label); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.pack(); // size components 
    frame.setVisible(true); // make it visible 
} 
public static void main(String[] args) { 
    new Rocks(); 
} 

} 

而且你要看到的,而不是覆盖paint()方法

因此,如果这Swing程序应该重写paintComponent()其他的事情(如果你仍然想使用面板)更改面板这样

public class Display extends JPanel{ 
    Image granite; 
    public Display(){ 
     granite = new ImageIcon("C:\\Users\\Raj\\Pictures\\Granite.png").getImage(); 
     setBackground(Color.black); 
    } 
    @Override // always add override annotation 
    public void paintComponent(Graphics g){ 
     super.paintComponent(g); // always call super first 
     Graphics2D g2d = (Graphics2D) g; 
     g2d.drawImage(granite,0,0,this); 
    } 
} 

类阅读:Painting in AWT and Swing components

+1

*“继承的构成。”* +1其余的也很好,但你在第一段有我。 :) –

+0

好的,我会的。谢谢。 – lilmessi42

+1

@AndrewThompson:D,如果他使用像matisse这样的gui编辑器,不要使用它的好理由。 – nachokk