请教awt包和Swing包中的paint(),repaint(),update()问题

meng_jian 2008-05-14 10:25:48
请教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();
}
}
...全文
444 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
meng_jian 2008-05-18
  • 打赏
  • 举报
回复
谢谢上几楼的兄弟,谁能够告诉我贴子里面提的问题(写在注释里)吗?
longlong143cn 2008-05-14
  • 打赏
  • 举报
回复
执行repaint()后,自动调用update()方法,然后调用paint()方法。
365810247 2008-05-14
  • 打赏
  • 举报
回复

paint()是在组件第一次显示时调用,完成组件的绘制。
update()进行初始化(背景色填充、设置组件前景色)后调用paint()绘制组件。
repaint()则调用update()。它之所以存在是因为要支持以不同的方式进行update()操作,
如:repaint();repaint (long time);
repaint(int x,int y,int width,int height),无参的repaint()只是对 update()进行简单的调用。
可以说,paint()是最原子的操作,update()则允许在它之上对它的外观进行一些定制,repaint()则偏重于定制调用的方式:你可以在指定时间间隔后进行重画,也可以在指定区域内绘制组件,等等。
ilrxx 2008-05-14
  • 打赏
  • 举报
回复
repaint()就是重绘,从字面上面理解,重新绘图不就是先刷新下画布,然后再画吗

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧