JPanelの持つGraphicsを別クラスから更新したい
初心者です、質問失礼します。
現在java
のswing
を使って、キー入力したら円が広がりながら消えていく、というパーティクルのようなアニメーションを作りたいと思っています。JPanel
を継承したSpreadCircle
でキー入力を監視して、入力されたらCircle
をインスタンス化してアニメーション開始するのですが、その際repaint()
を呼び出しているのにも関わらず画面に変化がありません。
なぜうまくアニメーションが表示されないのでしょうか?
また、paintComponent
の仕組みがよくわかっていないため、JPanel
を継承したクラス以外からrepaint()
やg.fillOval()
のようなGraphics
の情報を更新する方法がわかりません。
色々と考えてGraphics2D
の変数やSpreadCircle
の変数をstatic
にして見たのですがうまくいきませんでした。もっとスマートにGraphics
の更新(JPanel
のfillOval
やrepaint
等)を行う方法があれば教えていただけると幸いです。
Frame_of_SpreadCircle.java
import javax.swing.JFrame;
public class Frame_of_SpreadCircle{
static SpreadCircle panel = new SpreadCircle();
public static void main(String args[]) {
JFrame frame = new JFrame("SpreadCircle");
frame.addKeyListener(panel);
frame.add(panel);
frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
}
SpreadCircle.java
public class SpreadCircle extends JPanel implements KeyListener {
public static final int size = 50;
public static Graphics2D g2;
public SpreadCircle(){
super();
setPreferredSize(new Dimension(600,400));
setBackground(Color.GRAY);
}
@Override
public void keyTyped(KeyEvent e) {
// TODO 自動生成されたメソッド・スタブ
Circle circle = new Circle(size);
circle.drawCircle();
}
public void paintComponent(Graphics g) {
g2 = (Graphics2D) g;
super.paintComponent(g2);
g2.setRenderingHint(KEY_ANTIALIASING, VALUE_ANTIALIAS_ON);
}
@Override
public void keyPressed(KeyEvent e) {
// TODO 自動生成されたメソッド・スタブ
}
@Override
public void keyReleased(KeyEvent e) {
// TODO 自動生成されたメソッド・スタブ
}
}
Circle.java
public class Circle implements ActionListener {
int x;
int y;
int l;
int a;
int b;
int c;
int alpha = 100;
int time = 0;
Timer timer = new Timer(60,this);
Color color ;
public Circle(int w) {
l = w;
x = (int) (Math.random() * 300);
y = (int) (Math.random() * 200);
a = (int) (Math.random() * 256);
b = (int) (Math.random() * 256);
c = (int) (Math.random() * 256);
color = new Color(a,b,c,alpha);
timer.start();
}
public void drawCircle() {
SpreadCircle.g2.setColor(color);
SpreadCircle.g2.fillOval(x, y, l, l);
Frame_of_SpreadCircle.panel.repaint();
}
public void actionPerformed(ActionEvent e) {
// TODO 自動生成されたメソッド・スタブ
if(time < 10) {
l += 3;
alpha -= 10;
drawCircle();
Frame_of_SpreadCircle.panel.repaint();
}else {
SpreadCircle.g2.dispose();
timer.stop();
}
time++;
}
}