1

ここに画像の説明を入力

私は24時間前からずっとこれに取り組んできました。タイマーを使用して簡単なアニメーションを描画するカスタム jpanel があります。私が欲しいのは、このパネルをピカチュウとサスケの間の中央に表示することです (私はこれまでずっとやろうとしてきました)、アニメーションが開始され、このボタンがクリックされた場合にのみ発生します.

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class App extends JFrame {
private static JPanel p53 = new JPanel();
private static JButton fire = new JButton("Attack");
private AttackFX attackfx = new AttackFX();

public App() {

fire.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent atk) {
                    p53.add(attackfx);
                    Timer timer1 = new Timer(800, new ActionListener() {
                        @Override
                        public void actionPerformed(ActionEvent ld2) {
                        }
                    });
                    timer1.start();
                    timer1.setRepeats(false);
            }
        });
}

public static void main(String[] a) {
App Battleframe = new App();
Battleframe.add(fire);
Battleframe.add(p53);
Battleframe.setResizable(false);
Battleframe.setTitle("OnFight.Combat_Arena_Beta");
Battleframe.setSize(381, 400);
Battleframe.setLocationRelativeTo(null);
Battleframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Battleframe.setVisible(true);
}

class AttackFX extends JPanel {

    private int xCoor = 1;

 public AttackFX() {
 Timer tm1 = new Timer(100, new TimerListener2());
 tm1.start();
 tm1.setRepeats(true);
 }

 @Override
 protected void paintComponent(Graphics g) {
 super.paintComponent(g);

 xCoor += 1;

 g.setColor(Color.cyan);
 g.fillOval(xCoor, 40, 8, 8);
 }

 class TimerListener2 implements ActionListener {
 @Override
 public void actionPerformed(ActionEvent e) {
 repaint();
 }
 }

}
}

私は本当にあなたの助けが必要です。明日は、私が作っているこのプログラム全体のプレゼンテーションです。そして、これはそれを達成するための最後のステップです。私は自分でこれを解決するためにできる限りのことを試みましたが、成功しませんでした。

4

1 に答える 1

1

ボタンがクリックされたときに円を生成し、特定の x 値に達すると円を消す作業コードを次に示します。

public class App extends JFrame implements ActionListener {

  private static final long serialVersionUID = 1L;

  public static void main(String[] a) {
    App app = new App();
    app.createControls();
  }

  public App() {
    setResizable(false);
    setTitle("OnFight.Combat_Arena_Beta");
    setSize(381, 400);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLayout(new BorderLayout());
  }

  private void createControls() {
    JPanel upper = new JPanel();

    JButton fire = new JButton("Attack");
    fire.addActionListener(this);
    upper.add(fire);

    this.add(upper, BorderLayout.NORTH);
    setVisible(true);
  }

  /*
   * When the "Attack" button is pressed the time will start and the
   * circle will start painting.
   */
  @Override
  public void actionPerformed(ActionEvent e) {
    AttackFX attackfx = new AttackFX();

    this.add(attackfx, BorderLayout.CENTER);
    this.validate();
  }

  class AttackFX extends JPanel implements ActionListener {

    private static final long serialVersionUID = 1L;
    private int xCoor = 100;
    private Timer t;

    public AttackFX() {
        t = new Timer(10, this);
        t.start();
    }


    public void paintComponent ( Graphics graphics ) {
        super.paintComponent ( graphics );
        Graphics2D graphics2d = ( Graphics2D ) graphics;

        graphics.setColor ( Color.cyan );
        graphics2d.fillOval(xCoor, 40, 8, 8);
    }

    /*
     * The timer will fire an action every 10 milliseconds, moving
     * our circle by 1 each time.
     * 
     * I unfortunately had to hard code a value that the circle should stop at
     * but I am sure you can find a way around this.
     */
    @Override
    public void actionPerformed(ActionEvent e) {

        if (xCoor > 250) {
            t.stop();
            setVisible(false);
        }

        xCoor++;
        repaint();
    }
  }
}

setVisible() がこれを行う最善の方法かどうかはわかりませんが、JPanel を削除するよりも安全でした。どう考えているか教えてください。

于 2013-10-20T10:26:39.067 に答える