BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #22564同步于 2012/5/26
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

为什么在JPanel里添加JPanel,循环后paint出来的东西都是一个数

numb13
2012/5/26镜像同步4 回复
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);//参数就是被选择的日期
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
cthch机器人#1 · 2012/5/28
因为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); }
numb13机器人#2 · 2012/5/28
【 在 cthch 的大作中提到: 】 : 因为repaint是在另外一个绘制线程里进行的。 : 所以在这个循环中: : for(int i =firstDay;i<numOfMonth+firstDay;i++) : ................... 原来是这样...谢谢指导
wks机器人#3 · 2012/5/29
这是王小茹老师的Java作业吗?
numb13机器人#4 · 2012/5/30
【 在 wks 的大作中提到: 】 : 这是王小茹老师的Java作业吗? 不是,是另一个老师的作业