Java 在给定计数后重新绘制此JPanel的方法

Java 在给定计数后重新绘制此JPanel的方法,java,swing,jpanel,fractals,Java,Swing,Jpanel,Fractals,你好,我想阻止图形绘制和绘图再次,但我不知道如何做,我只想我的面板删除所有绘制的图形和重新启动相同的代码。我尝试了一些张贴在这里的方法,但没有人能做到这一点 public class Main extends JPanel implements ActionListener { Timer timer; private double angle = 444; private double scale = 1; private double delta = 0.0001; RoundRe

你好,我想阻止图形绘制和绘图再次,但我不知道如何做,我只想我的面板删除所有绘制的图形和重新启动相同的代码。我尝试了一些张贴在这里的方法,但没有人能做到这一点

     public class Main extends JPanel implements ActionListener {
Timer timer;
private double angle = 444;
private double scale = 1;
private double delta = 0.0001;
RoundRectangle2D.Float r = new RoundRectangle2D.Float();
int counter = 0;

public Main() {
    timer = new Timer(55, this);
    timer.start();
}

public void paint(Graphics g) {
    counter++;

    int h = getHeight();
    int w = getWidth();
    Graphics2D g2d = (Graphics2D) g;
    g2d.setColor(new Color(randomNumber(0, 155), randomNumber(0, 255),randomNumber(0, 155), randomNumber(0, 255)));
    drawCircles(g2d, getWidth()/2, getHeight()/2, 250);
    if(counter > 200){
        g2d.clearRect (0, 0, getWidth(), getHeight());
        super.paintComponent(g2d);
        counter = 0;
    }
}

public int randomNumber(int min, int max) {

    int c = new Random().nextInt((max - min) + 1);
    return c;
}

public static void main(String[] args) {

    JFrame frame = new JFrame();
    frame.setUndecorated(true);

    Dimension dim = new Dimension(Toolkit.getDefaultToolkit()
            .getScreenSize().width, Toolkit.getDefaultToolkit()
            .getScreenSize().height);

    frame.setSize(dim);
    frame.setLocation(0, 0);
    frame.setBackground(new Color(0, 0, 0, 255));
    frame.add(new Main());
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
}
void drawCircles(Graphics graphics, int xMid, int yMid, int radius) {
    // end recursion
    if(radius < 5)
        return;

    // Draw circle

    // start recursion
    //left
    drawCircles(graphics, xMid-radius, yMid, radius / 2);
    ((Graphics2D) graphics).rotate(angle);
    graphics.drawOval(xMid - radius, yMid - radius, radius * 2, radius * 2);

    //right
    drawCircles(graphics, xMid+radius, yMid, radius / 2);
    graphics.drawOval(xMid - radius, yMid - radius, radius * 2, radius * 2);

    ((Graphics2D) graphics).rotate(angle);

    ((Graphics2D) graphics).rotate(angle);
    ((Graphics2D) graphics).setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
    ((Graphics2D) graphics).setRenderingHint(RenderingHints.KEY_RENDERING,RenderingHints.VALUE_RENDER_QUALITY);
}

public void actionPerformed(ActionEvent e) {

    if (scale < 0.01) 
        delta = -delta;
    else if (scale > 0.99) 
        delta = -delta;
    scale += delta;
    angle += 0.001;
    repaint();
}
}
public类主扩展JPanel实现ActionListener{
定时器;
私人双角度=444;
私人双标度=1;
私人双增量=0.0001;
RoundRectangle2D.Float r=新的RoundRectangle2D.Float();
int计数器=0;
公用干管(){
定时器=新定时器(55,本);
timer.start();
}
公共空间涂料(图g){
计数器++;
inth=getHeight();
int w=getWidth();
Graphics2D g2d=(Graphics2D)g;
setColor(新颜色(randomNumber(0155)、randomNumber(0255)、randomNumber(0155)、randomNumber(0255));
画圈(g2d,getWidth()/2,getHeight()/2250);
如果(计数器>200){
g2d.clearRect(0,0,getWidth(),getHeight());
超级油漆组件(g2d);
计数器=0;
}
}
公共整数随机数(最小整数,最大整数){
int c=new Random().nextInt((最大-最小)+1);
返回c;
}
公共静态void main(字符串[]args){
JFrame=新JFrame();
框架。设置未装饰(真实);
维度dim=新维度(Toolkit.getDefaultToolkit()
.getScreenSize().width,Toolkit.getDefaultToolkit()
.getScreenSize().height);
框架。设置尺寸(尺寸);
帧设置位置(0,0);
框架背景(新颜色(0,0,0,255));
frame.add(新的Main());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
空心绘图圆(图形、int-xMid、int-yMid、int-radius){
//结束递归
如果(半径<5)
返回;
//画圈
//开始递归
//左
绘图圆(图形,xMid半径,yMid,半径/2);
((图形2d)图形)。旋转(角度);
绘图椭圆(xMid-半径,yMid-半径,半径*2,半径*2);
//对
绘图圆(图形,xMid+半径,yMid,半径/2);
绘图椭圆(xMid-半径,yMid-半径,半径*2,半径*2);
((图形2d)图形)。旋转(角度);
((图形2d)图形)。旋转(角度);
((Graphics2D)graphics).setRenderingHint(RenderingHits.KEY\u ANTIALIAS,RenderingHits.VALUE\u ANTIALIAS\u ON);
((Graphics2D)graphics).setRenderingHint(renderingHits.KEY_RENDERING,renderingHits.VALUE_RENDER_QUALITY);
}
已执行的公共无效操作(操作事件e){
如果(比例<0.01)
delta=-delta;
否则,如果(比例>0.99)
delta=-delta;
标度+=三角洲;
角度+=0.001;
重新油漆();
}
}

我不确定我是否完全理解您的意思,但您可以使用JToggleButton(例如),其中的切换按钮处于关闭状态,以防止绘图。我可以在您的
drawCircles()
方法中看到类似的内容:

void drawCircles(Graphics graphics, int xMid, int yMid, int radius)
{
    if(!toggleBtn.isSelected() // the toggle button is pressed
    {
        // draw something
    }
}
在您的示例中,您正在绘制两个圆和两个椭圆。如果我正确地理解了,你希望能够在方法的中间停顿,例如,只画第一个圆。然后,在某个时刻,您希望继续绘制两个椭圆和剩余的圆。不幸的是,你不能这样做。你不能停止(或暂停)中间的一个方法。 方法必须执行到完成(无论是执行到结束,还是抛出异常)。但是,您可以创建某种任务来绘制一个形状(例如,一个圆)。如果创建多个任务,则可以绘制多个圆。要实现这一点,您需要了解,可能还需要了解。您可以让这些任务按某种顺序执行,并且由于并发性,您可以按照我认为您希望的方式暂停和恢复这些绘图任务