2014-11-12 7 views
-1

Здравствуйте, я хотел бы еще раз предотвратить рисование графики и рисование, но я не знаю, как это сделать, я просто хочу, чтобы моя панель удаляла всю окрашенную графику и перезапускала тот же код. Я пробовал некоторые методы, размещенные здесь, но никто не выполняет эту работу.Способ перекрасить этот JPanel после заданного количества

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

ответ

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. Вы можете выполнять эти задачи в каком-то порядке и из-за параллелизма, вы можете приостановить и возобновить эти задачи рисования так, как я думаю, вы захотите.