2013-10-20 59 views
1

enter image description here顯示,並開始用的JPanel按鈕時繪製的動畫點擊

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

} 
} 

我真的需要你對這位先生的幫助。明天是我正在製作的整個節目的演示。這是完成它的最後一步。我盡我所能去解決這個問題,但沒有成功。

+3

1)爲了更好地提供幫助,請發佈[SSCCE](http://sscce.org/)。 2)請在句子開頭添加大寫字母。還要爲單詞I使用大寫字母,並使用JEE或WAR等縮寫詞和首字母縮略詞。這使人們更容易理解和幫助。 –

+1

*「我沒有太多時間。」*我沒有太多的耐心。 SSCCE在哪裏? –

+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更安全。讓我知道你的想法。

+0

我該如何減少動畫的閃爍效果?我要多次點擊攻擊按鈕,並且隨着我繼續單擊按鈕,閃爍會逐漸增強。 – rej

+0

閃爍的效果發生是因爲您要求在(100,40)已經行進一段距離時重新繪製圓圈。所以它會在這個x值和其他值之間滑動。 我昨晚試圖做出一些能夠阻止這一點的東西,但我找不到任何東西在同一個JPanel上創建多個圓,或者甚至動態生成JPanel。 – Rossiar

+0

感謝您的幫助先生。它真的讓我非常感興趣。 – rej

相關問題