java - 我无法理解paintComponent只有在repaint遇到Thread.sleep时才会执行
问题描述
我知道paintComponent (Graphics g) 方法是由AWT-EventQueueue 线程执行的。那么代码中的repaint方法和Thread.sleep()之间的填字游戏是不是可以同时执行paintComponent(Graphics g)方法呢?线程具有并发性。但经过几次实验后,我发现并非如此。repaint 方法仅在睡眠状态下执行。我知道遇到 Thread.sleep() 时会执行重绘,但我不太明白只有遇到 Thread.sleep() 时才会执行。
即使问题中有语法错误,也请理解。我不懂英语,我使用翻译。
package draw;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Shape;
import java.awt.geom.Rectangle2D;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class drawThread extends JPanel {
int y = 6;
ArrayList<Shape> shapeArray = new ArrayList<Shape>();
public drawThread() {
new Thread() {
public void run() {
int i = 1;
while(i<10) {
System.out.println(i + "." + Thread.currentThread().getName() + " 시작");
y = y + 4;
repaint(); //sleep이 걸렸을 때 실행된다.
for(int j=0;j<=10;j++) {
System.out.println(j);
}
i++;
try {
Thread.sleep(3000);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}.start();
}
@Override
protected void paintComponent(Graphics g) {
// TODO Auto-generated method stub
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setColor(Color.BLACK);
g2.setStroke(new BasicStroke(2));
Shape s = new Rectangle2D.Float(10,y,1,1);
g2.draw(s);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
JFrame jf = new JFrame();
jf.setTitle("Test");
jf.setSize(300,300);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.add(new drawThread());
jf.setVisible(true);
}
}
解决方案
推荐阅读
- javascript - 根据 Dropdownlist SelectionIndexChanged 事件更改页面的 URL
- mongodb - golang mongodb 迁移数据库库 mongo 到 mgo
- php - 从节点到 PHP 脚本的标准输入挂起
- javascript - 数字脚本之间的逗号
- python - Python lex - TypeError:未知文本
- amazon-web-services - Google adwords api 性能缓慢
- entity-framework - 如何使用我的新 DBContext 设置测试组织列表?
- python - 从 python 到 R:嵌套列表
- javascript - 菜单上的事件侦听器不起作用并且控制台错误“无法识别和忽略键“初始比例”。
- javascript - 查询 Firebase Realtime 数据库时,哪个更高效:按键名查询,或按其值查询