无法在Netbeans 7.0中将背景图像添加到JFrame

时间:2011-07-18 23:57:11

标签: java swing jframe

这是我的第一个问题,请耐心等待。

我正在开发一个应用程序(我已经完全设计了)。现在我处于编码阶段,我无法在JFrame上放置背景图像,同时仍然允许它扮演容器的角色,所以我可以在它上面放置按钮和那种性质的东西。

我已经在Netbeans 7.0中创建了这个JFrame类文件,如果有人可以通过Netbeans的界面告诉我如何做到这一点会很棒(如果没有,只需要代码就可以了)。

我已经知道我应该覆盖paintComponent方法(我已经完成了,但我的图像文件没有显示)。另外我还有第二个问题,我不想把图像的完整文件路径,我的源文件放在包中,现在我很困惑我把图像文件放在哪里。

编辑: initComponoents ()是Netbeans生成的方法,用于确定JFrame的属性。

public class TinyTowerOrganizerInterface extends javax.swing.JFrame {

/** Creates new form TinyTowerOrganizerInterface */
    Image backgroundImage = Toolkit.getDefaultToolkit().getImage("D:/Java/TinyTowerOrganizer/Images/Background.jpg");

public TinyTowerOrganizerInterface() throws IOException {

    initComponents(); 
    class BackgroundPanel extends javax.swing.JPanel{
        private Image image;
        public BackgroundPanel(Image image){
            this.image = image;
        }
        @Override
        public void paintComponent(Graphics g){
            super.paintComponent(g);
            g.drawImage(image, 0, 0, null);

        }

    }

}

@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
    setTitle("Tiny Tower Organizer");
    setFont(new java.awt.Font("Pixelated", 0, 18)); // NOI18N
    setMinimumSize(new java.awt.Dimension(900, 500));
    setName("frame"); // NOI18N
    setResizable(false);
    setUndecorated(true);

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGap(0, 900, Short.MAX_VALUE)
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGap(0, 500, Short.MAX_VALUE)
    );

    pack();
}


public static void main(String args[]) {
    java.awt.EventQueue.invokeLater(new Runnable() {

        @Override
        public void run() {
            try {
                new TinyTowerOrganizerInterface().setVisible(true);
            } catch (IOException ex) {
                Logger.getLogger(TinyTowerOrganizerInterface.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    });
}

1 个答案:

答案 0 :(得分:3)

  

我已经知道我应该覆盖paintComponent方法

JFrame没有paintComponent(...)方法。

相反,您应该扩展JPanel(或JComponent)并在paintComponent()方法中添加自定义绘制。然后将面板添加到框架中。

另外,不要忘记覆盖面板的getPreferredSize()方法以返回图像的大小。

编辑:

首先,当您发布代码SSCCE时,我们可以复制并执行代码。我在下面加了一个简单的SSCCE。

有不同的问题。

第一个问题是getImage()方法将图像读取为异步,因此当显示帧时,图像未完全加载,并且在运行代码时无法显示任何内容。而是使用ImageIO来读取图像。

  

我甚至想要完成什么

当您进行上述更改并运行代码时,即使已调用pack(),您仍只会看到一个小框架。这是因为您没有向poanel添加任何组件,因此默认的首选大小是(10,10),因为您使用的是FlowLayout。因此,您需要覆盖getPreferredSize()方法以返回图像的大小,以便可以正确打包面板。

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

public class MyApplication extends javax.swing.JFrame
{

/** Creates new form MyApplication */
    Image backgroundImage = Toolkit.getDefaultToolkit().getImage("mong.jpg");

    public MyApplication() throws IOException
    {

        this.setContentPane(new JPanel()
        {

            @Override
            public void paintComponent(Graphics g)
            {
                super.paintComponent(g);
                g.drawImage(backgroundImage, 0, 0, null);
            }
        });

        pack();
        setVisible(true);
    }


    public static void main(String[] args)
        throws Exception
    {
        new MyApplication();
    }
}