2016-08-01 4 views
-1

Ich würde gerne wissen, wie ich einen Timer und alle meine Zuhörer als innere Klassen anwenden kann. Ich bin immer noch verwirrt über innere Klassen, also kann jemand erklären und wie ich es auf mein eigenes Programm anwenden kann, das würde sehr geschätzt werden. Ich habe gerade Timer gelernt, aber ich bin mir nicht sicher, wo und wie ich es einstellen soll. Ich möchte für 60 Sekunden einstellen.Inner Listener & Timer für Fußball Spielprogramm

hier ist mein Code:

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

Sie sind bereits oben in einigen Ihrer ActionListeners „inneren“ Klassen - seien Sie deshalb so viel wie möglich angeben, was es genau ist, dass Sie ist verwirrend. Je besser wir die Frage verstehen, desto besser ist die Antwort. Ich bin etwas verwirrt darüber, warum Sie 'requestFocusInWindow();' innerhalb einer paintComponent-Methode aufrufen. Das sieht nach einer gefährlichen Sache aus, und ich bin mir nicht sicher, wann Sie diese Funktionalität überhaupt wollen. –

+0

Außerdem sehe ich oben keinen Timer-Code, also bitte erläutern Sie, was Sie damit meinen. Beziehen Sie sich auf eine Swing Timer (javax.swing.Timer) -Instanz? –

+0

Ich habe meine inneren Klassen herausgefunden und einen Timer hinzugefügt. Int Verzögerung = 1000; // Millisekunden tim = neuer Timer (Verzögerung, dies); tim.start(); // startet den Timer tim.setDelay (200); // setzt eine neue Verzögerung tim.stop(); // stoppt den Timer // stoppt den Timer –

Antwort

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{...} 
} 

mehr lesen auf inner classes.

lesen Sie mehr auf timers