我在JFrame类上使用netbeans builder“design”。 我有传统的JFrame,我在其中添加了(使用构建器)JPanel。
现在在代码中,我想为此面板添加一个背景,如下所示:
public class NewJFrame extends javax.swing.JFrame {
public NewJFrame() {
initComponents();
addBackground();
}
private void addBackground()
{
Image bgImage;
try {
bgImage = ImageIO.read(new File("src/general/Mockup.png"));
jPanel1.add(new NewJFrame.ImagePanel(bgImage));
jPanel1.repaint();
} catch (IOException ex) {
Logger.getLogger(NewJFrame.class.getName()).log(Level.SEVERE, null, ex);
}
}
public static void main(String args[]) {
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new NewJFrame().setVisible(true);
}
});
}
}
我什么都没看到,只是一个空的JFrame / JPanel。
顺便说一句,我将它用于ImagePanel代码
@SuppressWarnings("serial")
class ImagePanel extends JPanel {
private Image image;
ImagePanel(Image image) {
this.image = image;
};
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(image, 0, 0, getWidth(), getHeight(), this);
}
}
答案 0 :(得分:5)
您的班级ImagePanel extends JPanel {
must override getPreferredSize()
,
因为public void paintComponent(Graphics g) {
(painting in Swing
,Graphics(2D)
)没有将任何大小返回容器,简单返回Dimmension(0, 0
)
JPanel
已在API中实施FlowLayout
(仅接受来自其子级的PreferredSize
),然后您的custom painting
将永远不会在屏幕上显示< / p>
答案 1 :(得分:3)
什么是jPanel1?它使用什么布局? GUI渲染后ImagePanel对象有多大?为什么不简单地使用带有图像的JLabel(或ImagePanel实例)作为JFrame的contentPane,而不是通过所有这些体操?请注意,这种类型的编码是我避免使用NetBeans生成的代码的一个原因。让我自己编写代码,然后我可以完全控制GUI的所有内容和显示内容。
答案 2 :(得分:1)
为什么不简单地添加JLabel并在构造函数中插入图像名称?像:
JFrame background = new JFrame(“back.png”);
然后,您可以将此标签直接添加到框架或JPanel。