Java JPanel不会在JFrame中显示

时间:2012-12-27 00:33:52

标签: java swing jframe jpanel

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

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;  
}
}

1 个答案:

答案 0 :(得分:5)

没有显示任何内容,因为您正在缩短油漆堆栈的短路量。使用super.paintComponent,因此不会绘制任何子组件。

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

由于这实际上没有任何用处,因此可以将其删除,并显示添加的面板。