Listener Probleme

Hallo,
ich habe eine GUI programmiert, die den Verlauf eines geworfenes Balls darstellt (Schräger Wurf)
Nun möchte ich aber mit Listenern arbeiten, dass z.b. bei einer Taste die Kurve auf der Zeichenfläche erschein etc…
Da treten 2 Probleme auf:

  1. beim Action Listener führt er zwar die ganzen Berechnungen durch, aber zeichnet nur zum Schluss das Endbild und nicht den Verlauf wie beim Start
  2. der KeyListener funktioniert gar nicht, habe da schon diverse Implementierungen durchgekaut…

Danke für eure Hilfe

Hier mein Code der Hauptklasse:

public class Simulation extends JFrame implements ActionListener{
    private JButton bt_del,bt_start;
    private JSpinner sp_geschw, sp_winkel, sp_ahoehe;
    private JPanel pn_oben, pn_unten;
    private MyJPanel pn_ball;
    private Ball ball;
    private JFrame f;
    private Ballwurfmaschine bmaschine;
    private ArrayList<Point2D.Double> points;
    private final int BREITE = 400,HOEHE = 300;
    private final double faktor = BREITE *0.01;
    
    class MyKeyListener extends KeyAdapter {
        @Override
        public void keyPressed(KeyEvent e) {
            if (e.getKeyCode() == KeyEvent.VK_W) {
            System.out.println("Test");

            }
        }
    }

    public Simulation(Ballwurfmaschine m){
        super("Demo");
        bmaschine = m;
        ball = m.getBall();
        points = bmaschine.getTable();
        
        /**************************************************************
         *                        Frame einrichten                                                              *
         * ************************************************************/

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new FlowLayout());
        setSize(650,400);
        addKeyListener(new MyKeyListener());

        pn_oben = new JPanel();
        pn_unten = new JPanel();

        SpinnerNumberModel m_geschw = new SpinnerNumberModel(30,0,500,0.5);
        SpinnerNumberModel m_winkel = new SpinnerNumberModel(45,0,360,0.5);
        SpinnerNumberModel m_hoehe = new SpinnerNumberModel(0,0,500,0.5);
        sp_geschw = new JSpinner(m_geschw);
        sp_winkel = new JSpinner(m_winkel);
        sp_ahoehe = new JSpinner(m_hoehe);

        bt_start = new JButton("Start");
        bt_start.setActionCommand("starten");
        bt_start.addActionListener(this);
        bt_del = new JButton("Neu");
        bt_del.setActionCommand("loeschen");
        bt_del.addActionListener(this);

        pn_oben.add(new JLabel("Starthöhe:"));
        pn_oben.add(sp_ahoehe);
        pn_oben.add(new JLabel("Startgeschwindigkeit:"));
        pn_oben.add(sp_geschw);
        pn_oben.add(new JLabel("Winkel:"));
        pn_oben.add(sp_winkel);
        pn_oben.add(bt_start);
        pn_oben.add(bt_del);

        pn_ball = new MyJPanel(BREITE, HOEHE, bmaschine);

        pn_ball.setPreferredSize(new Dimension(BREITE, HOEHE));
        
        pn_unten.add(pn_ball);

        add(pn_oben);
        add(pn_unten);
        setVisible(true);

        zeichnen();
    }
        /**************************************************************
         *                        Die Listener                                                                     *
         * ************************************************************/
        //Action-Listener
        public void actionPerformed(ActionEvent e){
                Object obj = e.getSource();
                if (obj instanceof JButton){
                    String cmd = e.getActionCommand();
                    if (cmd.equals("starten")){
                        double winkel = (Double) sp_winkel.getValue();
                        double ahoehe = (Double) sp_ahoehe.getValue();
                        double v0 = (Double) sp_geschw.getValue();
                        ball.setStartY(ahoehe);
                        bmaschine.setWinkel(winkel);
                        bmaschine.setV0(v0);

                        bmaschine.berechnePos();
                        zeichnen();
                        bmaschine.ausgabe();
                    }
                    else if (cmd.equals("loeschen")){
                        System.out.println("Test");
                        pn_ball.removeAll();
                    }
                }
        }

   public void zeichnen(){
        for (Point2D.Double p : points){
            ball.setPosX(p.x*faktor);
            ball.setPosY(p.y*faktor);
            pn_ball.repaint();
            try {
                Thread.sleep(100);
            } catch (InterruptedException ex) {}
        }
   }
  
public static void main(String[] args) {
        double v0 = 30;
        double winkel = 65;

        Ball ball = new Ball(0,10);
        Ballwurfmaschine maschine = new Ballwurfmaschine (ball, v0, winkel);
        maschine.berechnePos();
        new Simulation(maschine);
        maschine.ausgabe();
    }    
}
```Vielen Dank für Eure Hilfe schon einmal im Voraus

Wieso gleich zwei mal hintereinander?
Hab eins gelöscht.

Für deinen ActionListener bräuchte man mehr Code, so kann man das nicht sagen. Und evtl. auch kompakter, sonst wirds ganz schnell ganz viel Code. Und am Besten auch als KSKB, dann wirds für uns leichter.

Dein KeyListener hat das Problem, dass du ihn nur zum JFrame hinzufügst. Wenn ein Button, ein JPanel, ein JTextField, … in deinem JFrame den Focus hat, dann hat dein JFrame den Focus nicht mehr und der KeyListener reagiert auch nicht mehr. Du musst den KeyListener an die Komponente hängen, die auch den Focus hat.

Der ActionListener läuft auf dem Thread, der für die graphische Darstellung reserviert ist: der EventDispatchThread, kurz EDT. Du musst also deine Animation in einem anderen Thread laufen lassen, sonst blockiert die GUI:

    public void run() {
        //hier deine Animation
        //(repaint() wird automatisch auf den EDT geschickt)
    }
}).start();```
In der main Methode sollte übrigens die GUI ebenfalls auf dem EDT gestartet werden, sonst kann es u.U. zu Startproblemen kommen. Die GUI wird mit SwingUtilities.invokeLater auf den EDT geschickt. Siehe auch: http://java.sun.com/docs/books/tutorial/uiswing/concurrency/initial.html
Für das KeyListener Problem könntest du es mit einem AWTEventListener versuchen. Siehe auch: http://tips4java.wordpress.com/2009/08/30/global-event-listeners/