这是我的第一个问题,请耐心等待。
我正在开发一个应用程序(我已经完全设计了)。现在我处于编码阶段,我无法在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);
}
}
});
}
答案 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();
}
}