java - 在 Netbeans 7.0 中向 JFrame 添加背景图像时出现问题

标签 java swing jframe

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

我正在开发一个应用程序(我已经完全设计了)。现在我正处于编码阶段,我在将背景图像放置在 JFrame 上时遇到困难,同时仍然允许它发挥容器的作用,以便我可以在其上放置按钮和类似性质的东西。

我已经在 Netbeans 7.0 中创建了这个 JFrame 类文件,如果有人能告诉我如何通过 Netbeans 接口(interface)来完成此操作,那就太好了(如果没有,只需代码就可以了)。

我已经知道我应该重写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);
            }
        }
    });
}

最佳答案

I already know that I am supposed to override the paintComponent method

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

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

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

编辑:

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

有不同的问题。

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

What is it that I even want to get accomplished

当您进行上述更改并运行代码时,即使调用了 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();
    }
}

关于java - 在 Netbeans 7.0 中向 JFrame 添加背景图像时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6740829/

相关文章:

java - Gradle : How to run tests from a module dependency?

java - JTable 缺少第一行

java - 无法将 JPanel 添加到 BorderLayout.CENTER

java - JTextArea 始终为空?

java - 当 textarea 与其他组件一起使用时,为什么 Java pack 无法正确调整框架大小?

java - 根据用户输入点创建折线图

java - 如何在 Java 中为 POSIX 扩展格式转义正则表达式文本

Java UDP 服务器无法解码正确的 IP 地址

java - 几分钟后杀死 java 进程 [Linux Ubuntu VPS]

java - 带有图像的 fillRect 方法