java gui中怎么向窗体中添加一张图片,要求不用icon

2025-03-26 06:27:28
推荐回答(2个)
回答1:

代码如下:

import java.awt.*;  
import java.awt.event.*;  
import javax.swing.*;  
   
public class GraExp extends JFrame  
{   
CInstead c1=new CInstead();  
Container c;  
JLabel lbl1=new JLabel("姓名:" );  
JLabel lbl2=new JLabel("密码:" );  
JTextField tf1=new JTextField(10),  
tf2=new JTextField(10);  
   
public GraExp()  
{   
setContentPane(c1);  
c=getContentPane();  
c.setLayout(new FlowLayout(FlowLayout.LEFT));  
c.add(lbl1);  
c.add(tf1);  
c.add(lbl2);  
c.add(tf2);  
   
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);  
setSize(new Dimension(400,300));  
show();  
}   
public static void main(String[] args)  
{   
GraExp ge=new GraExp();  
}   
class CInstead extends JPanel  
{   
ImageIcon icon;  
Image img;  
public CInstead()  
{   
icon=new ImageIcon(GraExp.class.getResource("333.png" ));  
img=icon.getImage();  
}   
public void paintComponent(Graphics g)  
{   
super.paintComponent(g);  
g.drawImage(img,0,0,null );  
}   
}   
}

程序分析: 
JComponent.paint先绘制组件,然后绘制组件的边框,再绘制组件的子组件。调用的顺序确保组件、边框和子组件都是可视的。如果组件有一个 UI代表,则JComponent.paintComponent调用该代表的Update方法,该方法为不透明组件擦除背景,然后绘制组件。 
CInstead是一个不透明的组件,如果重载paint方法,其背景图是无法被擦除的,因此,即使更新了组件的所有包含组件,在界面上是看不到的。所以必须重载paintComponent方法,在绘制子组件前先擦除背景。 
对双缓存组件,paint方法负责把组件绘制到屏外缓存中,然后把屏外缓存拷贝到组件的屏上代表中,正因为如此,不建议为Swing组件重载paint,如果需要重新定义如何绘制组件,那么就重载paintComponent()。 

回答2:

那用drawImage,需要的包,你自己包含以下。

package com.Swing;
import java.awt.Graphics;
import java.awt.Image;
import javax.swing.JPanel;

public class BackgroundPanel extends JPanel{
private Image image;
public BackgroundPanel(){
setOpaque(false);
setLayout(null);
}
public void setImage(Image image){
this.image = image;
}
/**
 * 画出背景
 */
protected void paintComponent(Graphics g){
if(image != null){
int width = getWidth();
int height = getHeight();
g.drawImage(image, 0, 0, width,height ,this);
}
super.paintComponent(g);
}
}



//这是在主类中的代码
backgroundPanel = new BackgroundPanel(); //创建背景面板
backgroundPanel.setImage(new ImageIcon("Image\\BackGround.jpg").getImage()); //设置背景图片
getContentPane().add(backgroundPanel, BorderLayout.CENTER);