一直没有做过java界面编程,而且现在居然还是修改别人的代码
小弟这里有一个程序,只有一个程序主界面,主类是继承于类JFrame,在主界面上只有简单的几个按钮、输入框什么的。我需要修改的是,在主界面上添加一个显示图片作为背景,但是图片添加以后,却将程序界面上的按钮等控件都覆盖了,鼠标扫到那里才能看见,有什么办法能让图片在最里层显示吗?
以下是我的部分代码:
private Image im = null;public CJForm() throws Exception
    {
        super();
        initialize();
        
    }
    
    public void paint(Graphics g)
    {
        int h = (int) Toolkit.getDefaultToolkit().getScreenSize().getHeight();
        int w = (int) Toolkit.getDefaultToolkit().getScreenSize().getWidth();
        g.drawImage(im,0,0,w,h-25,this);
    }    /**
     * This method initializes this
     *
     * @return void
     */
    private void initialize() throws Exception
    {
        
        int h = (int) Toolkit.getDefaultToolkit().getScreenSize().getHeight();
        int w = (int) Toolkit.getDefaultToolkit().getScreenSize().getWidth();
        //Toolkit t = new Toolkit();
        im = (Image)Toolkit.getDefaultToolkit().createImage("c:\\dsc07666.jpg");
        this.setSize(w, h-25);
        this.setLocation(0, 0);
        this.setContentPane(getJContentPane());
        this.setTitle("test");
        this.setVisible(true);
        this.setDefaultCloseOperation(3);
        this.setResizable(false);
        this.addWindowListener(new java.awt.event.WindowAdapter()
        {
            public void windowClosing(java.awt.event.WindowEvent e)
            {
                System.exit(0);
            }
        });
    }
    
    /**
     * This method initializes jContentPane
     *
     * @return javax.swing.JPanel
     */
    private JPanel getJContentPane() throws Exception
    {
        if (jContentPane == null)
        {
            jContentPane = new JPanel();
            jContentPane.setLayout(new BorderLayout());
            
            jContentPane.add(getFileSelectPanel(), java.awt.BorderLayout.NORTH);
            jContentPane.add(getFileSelectPanel2(),java.awt.BorderLayout.CENTER);
            jContentPane.add(getButtonPanel(), java.awt.BorderLayout.SOUTH);
            
        }
        return jContentPane;
    }

解决方案 »

  1.   

    我是在主程序类的paint()方法里g.drawImage(im,0,0,w,h-25,this);实现把图片显示在界面上的
      

  2.   

    分层,在你的JFrame 上建立一个JPanel。这个panel是最底层的panel.然后在这个panel上画你的图。然后再在这个panel上添加JPanle。再各个JPanel添加你的空间去。这个有点像PHOTOSHOP中的图层的感念。
      

  3.   

    太感谢楼主了,不过我对java的GUI类不是很熟悉,能用代码描述更细一点吗?
      

  4.   

    这是我在网上找的,你看看,我是个超级菜鸟import java.awt.Graphics;import javax.swing.ImageIcon;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;public class TestBackground extends JFrame{
            ImageIcon img;        public TestBackground(){
                    img = new ImageIcon("D:/temp/Winter.jpg");                JPanel panel = new JPanel(){
                            public void paintComponent(Graphics g){
                                    g.drawImage(img.getImage(), 0, 0, null);
                                    super.paintComponent(g);
                            }
                    };                panel.setOpaque(false);
                    panel.add( new JButton( "Hello" ) );
                    setContentPane( panel );
            }        public static void main(String [] args){
                    TestBackground frame = new TestBackground();
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setSize(300, 300);
                    frame.setVisible(true);
            }
    }
      

  5.   

    你可以使用JLayeredPane(分层面板)例如:.....
    private JLayeredPane layerPane = new JLayeredPane();
    .....layerPane.add(jlabelPassWord, JLayeredPane.DEFAULT_LAYER.intValue() );
        layerPane.add(jlabelID, JLayeredPane.DEFAULT_LAYER.intValue() );
        layerPane.add(jpassWord, JLayeredPane.DEFAULT_LAYER.intValue() );
        layerPane.add(jtextId, JLayeredPane.DEFAULT_LAYER.intValue() );
        layerPane.add(btCancel, JLayeredPane.DEFAULT_LAYER.intValue() );
        layerPane.add(btConfirm, JLayeredPane.DEFAULT_LAYER.intValue() );
        layerPane.add(btChangeSer, JLayeredPane.DEFAULT_LAYER.intValue() );
    //        layerPane.add(jPanelSta, JLayeredPane.DEFAULT_LAYER.intValue() );
        layerPane.add(statusBar,JLayeredPane.DEFAULT_LAYER.intValue()  ) ;
        layerPane.add(imaLabel,JLayeredPane.FRAME_CONTENT_LAYER.intValue()  ) ;//背景
        this.getContentPane().add(layerPane, null);
      

  6.   

    加背景图片正统做法,呵呵……((JPanel)frame.getContentPane()).setOpaque(false);ImageIcon img = new ImageIcon("img/icon.gif");
    JLabel background = new JLabel(img);
    frame.getLayeredPane().add(background, new Integer(Integer.MIN_VALUE));
    background.setBounds(0, 0, img.getIconWidth(), img.getIconHeight());
      

  7.   

    楼上的楼上,我觉的你应该把代码写的清楚一点,避免碰到我这种比较“菜”的。呵呵。
    ((JPanel)frame.getContentPane()).setOpaque(false);