2012-12-27 92 views
1

这是我第一次在stackoverflow上,我遇到了一个我似乎无法理解的问题。我试图独立开发一个小型的桌面游戏,它使用一个名为“Frame.java”的类来创建一个包含所有菜单的JFrame,并且我需要使用名为“create()”的方法来返回该框架。我还使用另一个名为“MainPanel.java”的类,该类扩展了JPanel,以创建一个MainPanel实例以添加到框架的内容窗格。但是,当我在我的小驱动程序中运行所有代码时,似乎没有任何显示。任何帮助,将不胜感激!Java JPanel将不会显示在JFrame中

public class MainPanel extends JPanel{ 

//the background image of the game 
private BufferedImage img = null; 
//GUI components of the game 
private JPanel gameWindow, gameWindowHolder, gameInfoHolder, LevelPanel, RevenuePanel, 
       ActionPanel, TimePanel; 

public MainPanel(String path, int width, int height){ 

    //create BufferedImage based on path 
    img = new ImageHelper().createBufferedImage(path); 
    //use img to create JPanel gameWindow 
    gameWindow = ImageHelper.makeImageComponent(img, width, height); 

    gameInfoHolder = new JPanel(); 
    gameInfoHolder.setPreferredSize(new Dimension(width+10, height+10)); 
    gameInfoHolder.setBackground(Color.black); 
    gameInfoHolder.add(gameWindow); 

    //set size of this MainPanel 
    setPreferredSize(new Dimension(width+300, height+10)); 
    //add gameInfoHolder to MainPanel 
    add(gameInfoHolder); 

} 

public void paint(Graphics g) { 
    super.paintComponent(g); 

} 
} 

public class Driver { 


public static void main(String []args){ 
    JFrame frame = Frame.create(); 

    JPanel panel = new MainPanel("images/backgrounds/jessicaAlba.jpg", 330, 500); 

    frame.getContentPane().add(panel); 

    frame.pack(); 
    frame.setVisible(true); 
} 

} 

public class ImageHelper { 


// 
//Returns an ImageIcon object based on the path 
// 
public ImageIcon createImageIcon(String path, String description){ 

    URL imgURL = getClass().getResource(path); 
    if (imgURL != null) 
     return new ImageIcon(imgURL, description); 
    else { 
     System.err.println("Couldn't find this file: " + path + ". Check path."); 
     return null; 
    } 
} 

// 
//Returns an Image object based on the path 
// 
public Image createImage(String path){ 

    URL imgURL = getClass().getResource(path); 
    Toolkit kit = Toolkit.getDefaultToolkit(); 

    if (imgURL != null){ 
     return kit.createImage(imgURL); 
    } 
    else { 
     System.err.println("Couldn't find this file: " + path + ". Check path."); 
     return null; 
    } 

} 

// 
//Returns a BufferedImage object based on the path 
// 
public BufferedImage createBufferedImage(String path){ 
    BufferedImage image; 
    URL imgURL = getClass().getResource(path); 
    try 
    { 
     image = ImageIO.read(imgURL); 
    } 
    catch (IOException e) 
    { 
     System.err.println("Couldn't find this file: \""+ path +"\". Check path."); 
     return null; 
    } 
    return image; 
} 

// 
//Returns a JPanel object composed of the image found in the path. 
// 
public static JPanel makeImageComponent(String path, int width, int height){ 
    BufferedImage image; 
    JLabel picLabel; 
    ImageIcon icon; 

    JPanel panel = new JPanel(); 
    JPanel panel2 = new JPanel(); 
    ImageHelper h = new ImageHelper(); 

    image = h.createBufferedImage(path); 
    image = resize(image, width, height); 
    icon = new ImageIcon(image); 

    panel.setPreferredSize(new Dimension(width, height)); 
    panel2.setPreferredSize(new Dimension(width+10, height+10)); 

    panel2.setBackground(Color.black); 
    picLabel = new JLabel(icon); 
    panel.add(picLabel); 
    panel2.add(panel); 

    return panel2; 
} 

// 
//Returns a JPanel object composed of the BufferedImage object in the argument 
// 
public static JPanel makeImageComponent(BufferedImage image, int width, int height){ 
    JLabel picLabel; 
    ImageIcon icon; 

    JPanel panel = new JPanel(); 
    image = resize(image, width, height); 
    icon = new ImageIcon(image); 
    panel.setPreferredSize(new Dimension(width, height)); 
    picLabel = new JLabel(icon); 
    panel.add(picLabel); 

    return panel; 
} 

// 
//Resizes the BufferedImage object to the specified new width and new height. 
// 
public static BufferedImage resize(BufferedImage img, int newW, int newH) { 
    int w = img.getWidth(); 
    int h = img.getHeight(); 
    BufferedImage dimg = new BufferedImage(newW, newH, img.getType()); 
    Graphics2D g = dimg.createGraphics(); 
    g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); 
    g.drawImage(img, 0, 0, newW, newH, 0, 0, w, h, null); 
    g.dispose(); 
    return dimg; 
} 
} 
+2

请学习如何格式化SO的代码。选择代码示例,然后单击邮件发布区域上方的“{}”。可能需要在代码清单之间添加一些普通文本。如果是这样,请将它作为课程的标题。为了更快地提供帮助,请发布[SSCCE](http://sscce.org/)。 –

+0

谢谢我会记住下次 – DarkyTheOdd

+0

不用担心,我会更深入地考虑下一个问题(当有SSCCE时)。 –

回答

5

没有什么作为你短路与super.paintComponent所以没有子组件将被涂油漆的 '叠加' 显示。

public void paint(Graphics g) { 
    super.paintComponent(g); 
} 

由于这确实没有任何用途,因此可以将其删除并添加面板。

+0

哇,工作,谢谢! – DarkyTheOdd