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

时间:2014-11-12 21:05:35

标签: 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;
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();
}
}

1 个答案:

答案 0 :(得分:0)

我不确定我是否完全理解你,但你可以使用JToggleButton(例如),切换按钮向下,它会阻止绘图。我可以在drawCircles()方法中看到类似的内容:

void drawCircles(Graphics graphics, int xMid, int yMid, int radius)
{
    if(!toggleBtn.isSelected() // the toggle button is pressed
    {
        // draw something
    }
}

在您的示例中,您绘制了两个圆圈和两个椭圆。如果我理解正确,您希望能够在方法的中间暂停,例如,只绘制第一个圆。然后,在某些时候,您想继续绘制两个椭圆和剩余的圆。不幸的是,你做不到。您无法在其中间停止(或暂停)某个方法。

方法必须执行完成(无论是结束还是抛出异常)。但是,您可以创建某种任务来绘制一个形状(例如,圆形)。如果您创建多个任务,则可以绘制多个圆圈。要完成此操作,您需要了解Concurrency,可能还要了解Java Tasks。您可以按某种顺序执行这些任务,并且由于并发性,您可以按照我认为您想要的方式暂停和恢复这些绘图任务。