3

我在 JFrame 类上使用 netbeans 构建器“设计”。我有传统的 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);
    }
}
4

3 回答 3

5
  • 你的班级ImagePanel extends JPanel {必须覆盖getPreferredSize()

  • 因为public void paintComponent(Graphics g) {( painting in Swing, Graphics(2D)) 不会将任何大小返回给容器,所以简单地返回Dimmension(0, 0)

  • JPanel已在 API 中实现FlowLayout(仅接受PreferredSize来自其子级的),那么您custom painting将永远不会在屏幕上可见

于 2013-02-01T23:27:34.843 回答
3

jPanel1 是什么?它使用什么布局?渲染 GUI 后 ImagePanel 对象有多大?与其经历所有这些体操,为什么不简单地使用带有图像(或 ImagePanel 实例)的 JLabel 作为 JFrame 的 contentPane?请注意,这种类型的编码是我避免使用 NetBeans 生成的代码的原因之一。让我自己编写代码,我可以完全控制我的 GUI 所做和显示的一切。

于 2013-02-01T23:14:32.733 回答
1

为什么不简单地添加一个 JLabel 并在构造函数中插入图像名称?喜欢:

JFrame 背景=新 JFrame("back.png");

然后,您可以将此标签直接添加到框架或 JPanel。

于 2013-02-01T23:15:36.737 回答