请教awt包和Swing包中的paint(),repaint(),update()问题,写一个学生信息管理的小程序,有三个界面板块
第一个是:学生信息管理(学号SNo,系部SDep)
第二个是:系部信息管理(系部SDep,系主任名称SMname)
第三个是:成绩信息管理(学号SNo,课程名称Cname,课程成绩grade)
这在个小程序中我想用只new次 学号lSNo,tSNo,和系部lSDep,tSDep,我用了CardLayout布局,遇到了二个问题,请各位指教另外对awt和swing中的三个方法paint(),repaint(),update()弄不清,这两个包中的三个方法是不是不同??
code 
******************************************************************************************************
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
class StudentInfo implements ItemListener{
final static String STUDENTPANEL = "学生信息管理";
final static String DEPARTMENTPANEL = "系部信息管理";
final static String SCOREPANEL = "成绩信息管理";
private JFrame jf;
private Container container;
private JPanel cards;
private String cardSwitchSign;
private JLabel lMName; JTextField tMName;
private JLabel lSDe;  JTextField tSDe;
private JLabel lSNo; JTextField tSNo;
private JLabel lCName; JTextField tCName;
private JLabel lGrade; JTextField tGrade;
private JButton jb_add;
private JButton jb_query;
private JButton jb_update;
private JButton jb_del;

public void launchFrame(){
jf=new JFrame("学生信息修改器");
jb_add=new JButton("添加");
jb_query=new JButton("查询");
jb_update=new JButton("更新");
jb_del=new JButton("删除");

lSDe=new JLabel("学生部门"); tSDe=new JTextField(40);
lMName=new JLabel("系主任名称"); tMName=new JTextField(40);
lSNo = new JLabel("学号"); tSNo = new JTextField(40);
lCName = new JLabel("课程名称"); tCName = new JTextField(40);
lGrade = new JLabel("课程成绩"); tGrade = new JTextField(40);
jf.setLayout(null);
container = jf.getContentPane();

String comboBoxItems[] = {STUDENTPANEL, DEPARTMENTPANEL, SCOREPANEL};
JComboBox cb = new JComboBox(comboBoxItems);
//cb.setSelectedIndex(0);
cb.setEditable(false);
cb.addItemListener(this);
cb.setBounds(10,0,120,20);
container.add(cb);

cards = new JPanel(new CardLayout());
cards.add(studentPane(),STUDENTPANEL);

                cards.setBounds(10,60,300,55);
container.add(cards);
//cb.setSelectedIndex(0);

JPanel pane2=new JPanel(new GridLayout(1,4,10,10));
pane2.add(jb_add);pane2.add(jb_query);
pane2.add(jb_update);
pane2.add(jb_del);
pane2.setBounds(20, 150, 350, 25);

ButtonAction o=new ButtonAction(this);
        jb_add.addActionListener(o);
        jb_del.addActionListener(o);
        jb_update.addActionListener(o);
        jb_query.addActionListener(o);
        container.add(pane2);
jf.setSize(400,220);
jf.setVisible(true);
jf.setResizable(false);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

public JPanel departmentPane(){
JPanel departmentPane = new JPanel(new GridLayout(2,2,3,10));
departmentPane.add(lSDe);  departmentPane.add(tSDe);
departmentPane.add(lMName);departmentPane.add(tMName);
return departmentPane;
}

public JPanel scorePane(){
JPanel scorePane = new JPanel(new GridLayout(3,2,3,10));
scorePane.add(lSNo);  scorePane.add(tSNo);
scorePane.add(lCName);scorePane.add(tCName);
scorePane.add(lGrade);scorePane.add(tGrade);
return scorePane;
}

public JPanel studentPane(){
JLabel jl = new JLabel("Label");
JPanel studentPane = new JPanel(new GridLayout(2,2,3,10));
studentPane.add(lSNo); studentPane.add(tSNo);
studentPane.add(lSDe);  studentPane.add(tSDe);
return studentPane;
}

public void itemStateChanged(ItemEvent e) {
CardLayout cardLayout = (CardLayout)cards.getLayout();
cardSwitchSign = e.getItem().toString();
//cardLayout.show(cards, cardSwitchSign);
                if(cardSwitchSign.equals("系部信息管理")){
cards.add(departmentPane(),DEPARTMENTPANEL);//问题一:此处动态添加departmentPane
                                                                   // 要不要动态的删除上一个Jpanel
                        cards.setBounds(10,60,300,55);                  }else if(cardSwitchSign.equals("学生信息管理")){
cards.add(studentPane(),STUDENTPANEL);
cards.setBounds(10,60,300,55);
}else{
cards.add(scorePane(),SCOREPANEL);
cards.setBounds(10,40,300,80);
}
cardLayout.show(cards, cardSwitchSign);
               //jf.repaint();  
               /*问题二:  为什么不能把cardLayout.show(cards, cardSwitchSign);这一句放在上面注掉的那个地方,而
                    在这儿加一个jf.repaint()呢?加在JPanel里面再刷新一下,不是就可以吗?*/ }

public static void main (String[] args) {
new StudentInfo().launchFrame();
    }
}

解决方案 »

  1.   

    执行repaint()后,自动调用update()方法,然后调用paint()方法。
      

  2.   

    repaint()就是重绘,从字面上面理解,重新绘图不就是先刷新下画布,然后再画吗
      

  3.   


    paint()是在组件第一次显示时调用,完成组件的绘制。 
    update()进行初始化(背景色填充、设置组件前景色)后调用paint()绘制组件。 
    repaint()则调用update()。它之所以存在是因为要支持以不同的方式进行update()操作,
    如:repaint();repaint (long time);
    repaint(int x,int y,int width,int height),无参的repaint()只是对 update()进行简单的调用。 
    可以说,paint()是最原子的操作,update()则允许在它之上对它的外观进行一些定制,repaint()则偏重于定制调用的方式:你可以在指定时间间隔后进行重画,也可以在指定区域内绘制组件,等等。