这是我的第一个问题,请耐心等待。
我正在开发一个应用程序(我已经完全设计了)。现在我正处于编码阶段,我在将背景图像放置在 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/