2

问题来了,因为我覆盖了 jPanel 的paintComponent 方法,所以当我重新绘制所有对象时,所有对象都被隐藏,直到我聚焦它们。我需要覆盖paintComponent 方法,因为它是我在互联网上找到的唯一一个更改jFrame 的背景图像的答案。

所以首先我创建了一个 jPanel 类:

    public class JPanelFondoPrincipal extends javax.swing.JPanel {

    public JPanelFondoPrincipal(){    
        this.setSize(800,500);
    }

    @Override
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        Dimension tamanio = getSize();
        ImageIcon imagenFondo = new ImageIcon(getClass().getResource("/images/fondo_principal.png"));        
        g.drawImage(imagenFondo.getImage(),0,0,tamanio.width, tamanio.height, null);        
        setOpaque(false);
    }
}

在我的 jPanelForm 中:

private void formWindowOpened(java.awt.event.WindowEvent evt) {                                  
    // TODO add your handling code here:
    JPanelFondo p = new JPanelFondo();
    this.add(p);
    validate();
    p.repaint();
}

我已经尝试将所有对象(标签、文本字段...)添加到新面板中,以便在重新绘制后添加它,并手动设置所有对象可见,但一切仍然不可见。

非常感谢,我需要在 6 天内完成应用程序,而且我每分钟都快疯了


编辑:感谢CARDLAYOUT解决

4

2 回答 2

3

Swing 程序应该覆盖paintComponent() 而不是覆盖paint()。

http://java.sun.com/products/jfc/tsc/articles/painting/

你应该super.paintComponent(g);首先在覆盖的paintComponent()中调用;

   public void paintComponent(Graphics g){
        super.paintComponent(g);
        Dimension tamanio = getSize();
        ImageIcon imagenFondo = new ImageIcon(getClass().getResource("/images/fondo_principal.png"));        
        g.drawImage(imagenFondo.getImage(),0,0,tamanio.width, tamanio.height, null);        
        setOpaque(false);
    }

这是在 JPanel 组件上处理绘画的正确方法。

于 2012-05-29T16:54:28.307 回答
3
  • 不要add/remove JPanels或其内容在运行时,使用CardLayout代替

  • 你的JPanelFondo p = new JPanelFondo();不对应public class JPanelFondoPrincipal extends javax.swing.JPanel {

  • 为了获得更好的帮助,请尽快使用SSCCE编辑您的问题,

于 2012-05-29T17:27:38.053 回答