The
while(true)
is never good inSwing
animation. Throw it out the window and say goodbye to it forever. Take that out of your method. You don't need it. The timer takes care of the "looping"Don't start the
Timer
in thepaintComponent
method. Do it in the constructor.You should run your Swing apps on the Event Dispatch Thread by wrapping your code in a
SwingUtilities.invokeLater..
. See Initial Threads for more details.You should be setting the frame visible after adding all component.
You
if
statements in yourSuperSizeCircle()
mess with each other if you look at the logic. That's why you need the keep adding. That doesn't look right to me. Instead us a flag (boolean) to determine whether it should grow or shrinkboolean grow = true; public void SuperSizeCircle() { if (XDiameter >= 200) { grow = false; } if (XDiameter <= 20) { grow = true; } if (grow) { XDiameter += 2; YDiameter += 2; } else { XDiameter -= 2; YDiameter -= 2; } }
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
public class CirclePanel extends JPanel implements ActionListener {
Timer tm = new Timer(15, this);
boolean grow = true;
int XDiameter = 20;
int YDiameter = 20;
public CirclePanel() {
tm.start();
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.GREEN);
g.fillOval(50, 50, XDiameter, YDiameter);
}
@Override
public void actionPerformed(ActionEvent e) {
SuperSizeCircle();
repaint();
}
public void SuperSizeCircle() {
if (XDiameter >= 200) {
grow = false;
}
if (XDiameter <= 20) {
grow = true;
}
if (grow) {
XDiameter += 3;
YDiameter += 3;
} else {
XDiameter -= 3;
YDiameter -= 3;
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFrame frame = new JFrame("Circle enlarger");
CirclePanel co = new CirclePanel();
frame.add(co);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 300);
frame.setVisible(true);
}
});
}
}