gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 06:19:42 25 4
gpt4 key购买 nike

这是我的第一个问题,所以请多多包涵。

我正在开发一个应用程序(我已经完全设计了它)。现在我处于编码阶段,我无法在 JFrame 上放置背景图像,同时仍然允许它作为容器发挥作用,因此我可以在它上面放置按钮和类似的东西。

我已经在 Netbeans 7.0 中创建了这个 JFrame 类文件,如果有人可以通过 Netbeans 的接口(interface)告诉我如何做到这一点,那就太好了(如果没有,代码就可以了)。

我已经知道我应该重写paintComponent 方法(我已经这样做了,但是我的图像文件没有显示)。另外我还有第二个问题,我不想放置图像的完整文件路径,我的源文件放在包中,现在我对放置图像文件的位置感到很困惑。

编辑:初始化组件 () 是 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com