返回信息流class MyPanel extends JPanel//这个是被嵌入的JPanel
{
public void paint(Graphics g)
{
super.paint(g);
g.setFont(new Font("宋体",Font.BOLD,30));
g.drawRect(0, 0, 60,40);
if(num == 0)
{
g.drawString(" ", 15, 30);
}
else
{
g.drawString(String.valueOf(num), 15, 30);
}
}
MyPanel[] date = new MyPanel[35];
for(int i = 0;i<35;i++)
{
date[i] = new MyPanel();
}
int num = 0;//给用于计数的num赋初值
public void show(int thisYear,int thisMonth)//改变文本域的内容
{
setVoidText();//让文本域为空
int firstDay=getTheFirstDayOfMonth(thisYear,thisMonth);//取得这个月的第一天是星期几
int numOfMonth = getNumOfMonth(thisYear,thisMonth);//这个月的天数
for(int i =firstDay;i<numOfMonth+firstDay;i++)
{
num = i-firstDay+1;
date[i-1].repaint();
}
}
然后省略了许多空间及步骤
调用show(jcb1.getSelectedIndex()+1900,jcb2.getSelectedIndex()+1);//参数就是被选择的日期
这是一条镜像帖。来源:北邮人论坛 / java / #22564同步于 2012/5/26
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
为什么在JPanel里添加JPanel,循环后paint出来的东西都是一个数
numb13
2012/5/26镜像同步4 回复
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
因为repaint是在另外一个绘制线程里进行的。
所以在这个循环中:
for(int i =firstDay;i<numOfMonth+firstDay;i++)
{
num = i-firstDay+1;
date[i-1].repaint();
}
repaint()不会马上调用paint(),而是在循环全部完成之后再调用。
循环完成时num的值为31,所以你全部pannel都是31啦。
建议你不要使用repaint,可以放置label到panel里面,然后用label来显示数字,这样就不存在上面的问题了。
代码:
//放到MyPanel里面
public void paintLabel(String i){
JLabel lb =new JLabel();
lb.setBounds(0, 0, 20, 20);
lb.setText(i);
this.add(lb);
}
//在循环中调用:
for(int i =...;i<...;i++)
{
String a;
num =...;
if (num==0){a=" ";}else{a=String.valueOf(num);}
date[i].paintLabel(a);
}
【 在 cthch 的大作中提到: 】
: 因为repaint是在另外一个绘制线程里进行的。
: 所以在这个循环中:
: for(int i =firstDay;i<numOfMonth+firstDay;i++)
: ...................
原来是这样...谢谢指导