2016-08-01 28 views
-1

我想知道如何将一个Timer和我的所有监听器应用为内部类。我仍然对内部类感到困惑,所以有人可以解释,我怎样才能将它应用到我自己的程序中,这将非常感激。我刚刚学会了计时器,但我不确定在哪里以及如何设置它。我想设定60秒。内部监听器和计时器的足球游戏程序

这里是我的代码:

package runningback; 

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

public class MainPanel extends JPanel implements KeyListener 
{ 
    JLabel text = new JLabel("Touchdowns: "); 
    JLabel text2 = new JLabel("Tackles: "); 
    JLabel touchdownsLbl; 
    JLabel tacklesLbl; 
    JButton movingButton = new JButton("key code"); 
    JButton startBtn = new JButton("Start"); 
    JLabel background=new JLabel(new ImageIcon("playground.png")); 
    JLabel rb=new JLabel(new ImageIcon("rb.png")); 
    JLabel tackler=new JLabel(new ImageIcon("tackler.png")); 
    int x =0; 
    int y = 10; 
    int touchdowns; 
    int tackles; 
    Player mainPlayer; 
public MainPanel() 
{ 
     mainPlayer = new Player(); 
     touchdowns = 0; 
     tackles = 0; 
     touchdownsLbl = new JLabel(Integer.toString(touchdowns)); 
     tacklesLbl = new JLabel(Integer.toString(tackles)); 

     setLayout(null); 
     //setBackground(Color.pink); 
     add(text); 
     add(text2); 
     add(touchdownsLbl); 
     add(tacklesLbl); 
     text.setBounds(new Rectangle(350, 20, 350, 30)); 
     text2.setBounds(new Rectangle(450, 20, 350, 30)); 
     touchdownsLbl.setBounds(new Rectangle(435, 20, 350, 30)); 
     tacklesLbl.setBounds(new Rectangle(505, 20, 350, 30)); 
     setFocusable(true); 
     addKeyListener(this); 
     add(rb); 
     add(background); 
     background.setBounds(new Rectangle(0, 94, 624, 416)); 

     rb.setBounds(new Rectangle(mainPlayer.x, mainPlayer.y, 50, 44)); 
     //add(movingButton); 
     startBtn.setBounds(new Rectangle(250, 20, 80, 30)); 
     add(startBtn); 
     startBtn.addActionListener(new ActionListener(){ 
      public void actionPerformed(ActionEvent e) { 
       //System.out.println("Button Pressed"); 
       gameReset(); 
      } 
     }); 
    //---------------------TIMER------------------------------ 
     int delay = 1000; // milliseconds 
     tim = new Timer(delay,this); 

     tim.start(); // starts the timer 
     //---------------------TIMER------------------------------ 
     tim.setDelay(200); // sets a new delay 
     tim.stop(); // stops the timer // stops the timer 
    } 

     } 
public void keyPressed(KeyEvent evt) 
{ 
//System.out.println("Key pressed"); 
int kk = evt.getKeyCode(); 
if(kk == evt.VK_LEFT) {mainPlayer.x=mainPlayer.x-mainPlayer.speed;} 
if(kk == evt.VK_RIGHT) {mainPlayer.x=mainPlayer.x+mainPlayer.speed;} 
if(kk == evt.VK_UP) {mainPlayer.y=mainPlayer.y-mainPlayer.speed;} 
if(kk == evt.VK_DOWN) {mainPlayer.y=mainPlayer.y+mainPlayer.speed;} 
update(); 
//movingButton.setText(""+evt.getKeyCode()+","+evt.getKeyChar()); 
//movingButton.setBounds(new Rectangle(x,y,80,30)); 
} 

void update(){ 
rb.setBounds(new Rectangle(mainPlayer.x, mainPlayer.y, 50, 44)); 
} 

void gameReset(){ 
    mainPlayer.x = 30; 
    mainPlayer.y = 280; 
    update(); 
} 
public void keyReleased(KeyEvent evt) { } 
public void keyTyped(KeyEvent evt) { } 
public void paintComponent(Graphics g) 
{ 
    //System.out.println("Painting"); 
    super.paintComponent(g); 
    requestFocusInWindow(); 
} 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(624, 500); 
} 

} 
+0

您已经在使用上面一些你的ActionListeners的“内部”类 - 所以请注明尽可能它是什么,究竟是混淆你。我们越理解这个问题,通常答案就越好。我自己,我有点困惑,为什么你要调用'requestFocusInWindow();'paintComponent方法内部。这看起来像是一件危险的事情,我不确定你什么时候会想要这种功能。 –

+0

另外,我没有看到上面的任何定时器代码,所以请澄清你的意思。你指的是一个Swing Timer(javax.swing.Timer)实例吗? –

+0

我想出了我的内部类,并添加了一个计时器。 int delay = 1000; //毫秒 tim = new Timer(delay,this); tim.start(); //启动计时器 tim.setDelay(200); //设置新的延迟 tim.stop(); //停止计时器//停止计时器 –

回答

3
public class MainPanel { 
    // setting timer 
    public void startTimer(double delay){ 
     long milisecond = 1000l; 
     Timer t = new Timer((int) (delay*milisecond), new TimerListener()); 
     t.setInitialDelay((int) (delay*milisecond)); 
     t.start(); 
    } 

    // inner classes 
    public class TimerListener implements ActionListener{...} 
    public class KeyListener extends KeyAdapter{...} 
} 

inner classes阅读更多。

阅读更多关于timers