为什么repaint没有调用paint或update?

fz4628413 2012-05-07 05:07:59
import java.awt.*;
import javax.swing.*;

public class Test implements Runnable{
private static BoardPanel boardPanel = new BoardPanel();
Test(){
new Thread(this).start();
}
@Override
public void run(){
int i = 1;
while(true){
try{
Thread.sleep(30);
}
catch(InterruptedException e){
}
boardPanel.repaint();
System.out.println("Thread run "+(i++));
}
}
public static void main(String[] args){
new Test();
BoardPanel boardPanel = new BoardPanel();
JFrame frame = new JFrame();
frame.add(boardPanel,BorderLayout.CENTER);
frame.setSize(475,494);
frame.setResizable(false);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
class BoardPanel extends JPanel{
@Override
public void update(Graphics g){
paint(g);
}
int i = 1;
@Override
public void paint(Graphics g){
System.out.println("paint "+(i++));
}
}
...全文
277 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
fz4628413 2012-05-07
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

上边的解释有问题 应该是改变指向后boardPanel作为主线程的资源一直被占用了 所以另一个线程中才无法调用 大概应该是这个样子
[/Quote]谢谢!我犯二了……
logic_well 2012-05-07
  • 打赏
  • 举报
回复
上边的解释有问题 应该是改变指向后boardPanel作为主线程的资源一直被占用了 所以另一个线程中才无法调用 大概应该是这个样子
logic_well 2012-05-07
  • 打赏
  • 举报
回复
将main方法里的BoardPanel boardPanel = new BoardPanel(); 引用改下就可以了正常调用repaint了
我的机子快 在执行到这句改变引用指向前boardpanel作为一个静态对象调用了repaint两次 但一旦主线程到这句改变boardpanel指向 boardpanel便不再是Test类里的静态成员变量了 它调用的repaint()方法就不再是你所想看的的那个System.out.println("paint "+(i++));了
fz4628413 2012-05-07
  • 打赏
  • 举报
回复
自己顶~
fz4628413 2012-05-07
  • 打赏
  • 举报
回复
不明白为什么repaint只调用paint一次,大家看看效果就明白我的意思了。
《java程序设计》课程的题库资料,由贺州学院整理,可供学生期末课程复习使用,也可以供相关任课教师出卷使用。 内容示例为: 103. 用于设置组件大小的方法是( )。 A.paint() B.setSize() C.getSize() D.repaint() 答案:B [解析] 可以使用setSize()方法来设置组件的大小。paint()和repaint()是与Applet显示相关的两种方法,paint()具体执行Applet的绘制,repaint()方法,主要用于Applet的重新显示,它调用update()方法实现对Applet的更新。因此,本题的正确答案是B。 104. 单击窗口内的按钮时,产生的事件是( )。 A.MouseEvent B.WindowEvent C.ActionEvent D.KeyEvent 答案:C [解析] 当按钮被单击后,会产生ActionEvent事件,需要ActionListener接口进行监听和处理事件。因此,本题的正确答案是C。 105. 下列语句中,可以作为无限循环语句的是( )。 A.for(;;){} B.for(int i=0;i<10000;i++){} C.while(false){} D.do{}while(false) 答案:A [解析] 本题中的while循环和do-while循环中当布尔表达式的值为true时,执行循环体中的语句。若某次判断其值为false,则结束循环。选项B的for循环中当i的值小于10000,则执行循环语句,当i的值大于10000时结束循环。只有选项A的for循环语句可以作为无限循环语句。因此,本题的正确答案是A。 106. 下列表达式中,类型可以作为int型的是( )。 A."abc"+"efg" B."abc"+'efg' C.'a'+'b' D.3+"4" 答案:C [解析] 字符常量是用单引号括起来的一个字符,如‘a’。用双引号括起来的是字符串,如“Shanghua”。字符型数据类型能向int数据类型自动转换,而字符串不可以。选项A、B、D都含有字符串。因此,本题的正确答案是C。 107. 在switch(expression)语句中,expression的数据类型不能是( )。 A.double B.char C.byte D.short 答案:A [解析] 表达式expresion只能返回几个类型的值:int、byte、short和Char。题目中的double是不正确的。多分支结构中,case子句的值必须是常量。而且所有case子句中的值应是不同的,default子句是任选的。当表达式的值与任一case子句中的值都不匹配时,如果有default语句,则程序执行default后面的语句;如果没有default语句,则程序不做任何操作直接跳出switch语句。

62,614

社区成员

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

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