在学GUI编程时,对paint() paintComponent() paintAll()调用时机十分模糊,老师也讲不清楚
自己学习研究始终摸不到路子,现在做个GUI体现个这个问题的重要性,源如下
================================================
class MyPanel extends JPanel//自定义JPanel,实现2个方法,要求根据传入图片绘制在固定位置
{
Image img=null;
public void setimg(Image g)
{img=g;}
public void paintComponent(Graphics x)
{
super.paintComponent(x);
if (img!=null)
x.drawImage(img,320,40,this);
}
}
============================
class FaceChange implements ItemListener//用于注册JComboBox的ITEM选择事件
{
         boolean flag=false;//使用该变量是因为itemStateChanged老是自动调用2次(为什么)
public void itemStateChanged(ItemEvent e)
{ Graphics g=P.getGraphics();//P对象为MyPanel的实力
int i=Face.getSelectedIndex();//获得当前JComboBox的ITEM
if (flag==false)
{
P.setimg(img_obj[i]);//调用P的setimg给出Image对象,img_obj[]是Image对象数组
P.paintComponent(g);
flag=true;
}
else
{
flag=false;
}
}

//=====================
执行问题是的确能顺利显示图片,但如果有10张图片,从1选择到5,然后再选择3,该图片也能正确
显示,但该JPanel上的其他控件却不见了,也就是说,不能选择选择过的选项,否则即出现该问题
求解,我实在研究不透了
//======================================
//=======================================
源码如下
import java.io.*;
import java.util.*;
import java.sql.*;
import java.net.*;
import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
//======================================
class MyPanel extends JPanel
{
Image img=null;
public void setimg(Image g)
{
img=g;
}
public void paintComponent(Graphics x)
{
super.paintComponent(x);
if (img!=null)
x.drawImage(img,320,40,this);
}
}
class RegisterFrame extends JDialog
{
Font f=new Font("黑体",Font.PLAIN,15);//设置字体
MyPanel P=new MyPanel();
JLabel L1=new JLabel("用户昵称");
JLabel L2=new JLabel("用户密码");
JLabel L3=new JLabel("确认密码");
JLabel L4=new JLabel("选择肖像");
JLabel L5=new JLabel("个人说明");
JTextField T1=new JTextField();
JPasswordField T2=new JPasswordField();
JPasswordField T3=new JPasswordField();
JTextArea T4=new JTextArea(5,20);
JComboBox Face=new JComboBox();
Image img_obj[]=new Image[95];
FaceChange CF =new FaceChange();//改变头像
RegisterFrame()
{super(new Frame(),"注册新用户");

Toolkit Tool=Toolkit.getDefaultToolkit();
Face.addItem("无");
for (int i=0;i<img_obj.length;i++)
{
img_obj[i]=Tool.getImage("face//"+(i+1)+".jpg");
Face.addItem(i+1+"号肖像");
}
this.getContentPane().add(P);
//P.setBackground(Color.white);
P.setLayout(null);
L1.setBounds(30,40,100,20);
T1.setBounds(130,40,100,20);
L2.setBounds(30,70,100,20);
T2.setBounds(130,70,100,20);
L3.setBounds(30,100,100,20);
T3.setBounds(130,100,100,20);
L1.setFont(f); L2.setFont(f); L3.setFont(f);
P.add(L1);P.add(L2);P.add(L3);P.add(T1);P.add(T2);P.add(T3);
L4.setBounds(250,70,100,20);Face.setBounds(250,100,100,20);
P.add(L4);P.add(Face);


Face.addItemListener(CF);
this.setSize(400,400);
this.addWindowListener(new wexit());
this.setResizable(false);
this.setModal(true);
  this.setVisible(true);
}

class wexit extends WindowAdapter
{
public void windowClosing(WindowEvent e)
{
if (e.getID()==e.WINDOW_CLOSING)
{dispose();}
}
}
class FaceChange implements ItemListener
{
boolean flag=false;
public void itemStateChanged(ItemEvent e)
{ Graphics g=P.getGraphics();
int i=Face.getSelectedIndex();
if (flag==false)
{
P.setimg(img_obj[i]);
P.paintComponent(g);
flag=true;
}
else
{
flag=false;
}

}

}