Как использовать paintComponent в цикле? - PullRequest
0 голосов
/ 28 апреля 2019

Я пытаюсь нарисовать много фигур, используя метод рисования компонентов, но я получил нежелательный результат.Итак ... на несколько секунд мой кадр белый и после 'Draw'== 0 он показывает все мои фигуры в один момент.Я хотел бы нарисовать одну фигуру, затем подождать 500 мс, затем нарисовать другую фигуру, не удаляя предыдущую.

public package GUI;

import java.awt.*;
import java.io.*;
import javax.swing.*;


public class okno3 extends JPanel{
String sb="";
int pozx,pozy,pozx2,pozy2,r,s,krztalt;
Color c;
int Draw = 3;

public static void main(String args[]){
    JFrame Frame = new JFrame();
    okno3 okno = new okno3();
    Frame.setSize(768,768);
    Frame.setTitle("Projetk 3");
    Frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    Frame.setVisible(true);
    Frame.add(okno);
}

public void paintComponent(Graphics g) {
    g.setColor(Color.BLACK);
    g.fillRect(0, 0, getWidth(), getHeight());
    g.setColor(getForeground());

    while(this.Draw>0) {
        this.Draw--;
        this.c = new Color((int)(Math.random()*255), (int)(Math.random()*255), (int)(Math.random()*255));
        g.setColor(c);
        this.pozx = (int)(getWidth()*Math.random());
        this.pozy = (int)(getHeight()*Math.random());
        this.pozx2 = (int)(getWidth()*Math.random());
        this.pozy2 = (int)(getHeight()*Math.random());
        this.r =(int)(Math.random()*75)+25;
        this.s =(int)(Math.random()*75)+25;

        this.krztalt = (int)(Math.random()*3)+1;

        switch(krztalt) {
            case 1:
                g.drawOval(pozx, pozy, r, s);
            break;
            case 2:
                g.drawRect(pozx, pozy, r, s);
            break;
            case 3:
                g.drawLine(pozx, pozy, pozx2, pozy2);
            break;
        }
        try{
            FileWriter fstream = new FileWriter("Wynik.txt");
            BufferedWriter out = new BufferedWriter(fstream);
            String sb = krztalt + " " + pozx + " " + pozy + " " + r + " " + s + " " + c;
            this.sb = sb + "\n" + this.sb;
            fstream.write(this.sb);
            fstream.close();

            out.close();
            }
        catch (Exception e){
            System.out.println("Error: " + e.getMessage());
        }
        try{
            Thread.sleep(500);
        }

        catch (InterruptedException e){
            e.printStackTrace();
        }
    }
}
}

1 Ответ

1 голос
/ 29 апреля 2019

Не спите внутри paintComponent метода или любого другого метода, который выполняется в EDT. EDT (Thread Dispatch Thread) - это отдельный поток, используемый для обработки событий и других последовательных задач, таких как рисование. Таким образом, ни одно из ваших изменений не будет отображаться до тех пор, пока вы не уйдете paintComponent.

Вам необходимо выполнить все ваши вычисления за пределами paintComponent, а затем каждые 500 миллисекунд, вызывать repaint() и paintComponent перекрасить их. Лучше всего использовать таймер Swing для ожидания переадресации вызовов.

Ознакомьтесь с Custom Painting в Учебниках Java и найдите этот сайт для получения дополнительной информации о рисовании и нити рассылки событий.

...