首页 > 解决方案 > 我无法理解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);
    }
}

标签: javaswingrepaint

解决方案


推荐阅读