tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
6
ZUGRIFFE
665
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    celtx celtx ist offline Mitglied Bronze
    Registriert seit
    Nov 2010
    Beiträge
    48
    Hallo,

    Ich habe diese Klasse zum KeyListener erstellt. Wenn ich sie ausführe dann öffnet sich einfach nur ein weises Fenster, erscheinen müsste aber ein Kreis, in diesem Fenster, den man über die Tastatur bewegen kann. Kann mir da jemand weiterhelfen was ich an dem Code verändern muss damit das ganze läuft. Vielen Dank



    Hier der Code:


    import javax.swing.*;
    import java.awt.*;
    import java.awt.Event.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    import java.awt.geom.*;

    public class second extends JPanel implements ActionListener, KeyListener {

    Timer t = new Timer (5, (ActionListener) this);
    double x = 0, y = 0, velx = 0, vely =0;

    public second(){
    t.start();
    addKeyListener((KeyListener) this);
    setFocusable(true);
    setFocusTraversalKeysEnabled(false);
    }

    public void paintComponents(Graphics g){

    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D) g;
    g2.fill(new Ellipse2D.Double(x, y, 40, 40));


    }
    public void actionPerformed(ActionEvent e){
    repaint();
    x += velx;
    y += vely;

    }

    public void up() {
    vely= -1.5;
    velx= 0;
    }

    public void down() {
    vely= 1.5;
    velx= 0;
    }



    public void left() {
    velx= -1.5;
    vely= 0;
    }



    public void right() {
    velx= 1.5;
    vely= 0;
    }

    public void keyPressed(KeyEvent e){
    int code = e.getKeyCode();
    if (code == KeyEvent.VK_UP){
    up();
    }
    if (code == KeyEvent.VK_DOWN){
    down();
    }
    if (code == KeyEvent.VK_RIGHT){
    right();
    }
    if (code == KeyEvent.VK_LEFT){
    left();
    }
    }
    public void keyTyped(KeyEvent e) {

    }
    public void keyReleased(KeyEvent e){

    }
    }
     

  2. #2
    Avatar von sheel
    sheel sheel ist gerade online Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.506
    Willkommen bei tutorials.de

    Zuerst einmal: Bitte schreib deinen Code zukünftig zwischen [java]...[/java], damit wirds lesbarer.

    Zu deinem Code:
    1)Warum überschreibst du paintComponents?
    Nimm paint statt paintComponents, und in der Methode auch entsprechend super.paint statt super.paintComponents.

    2)Die Methode actionPerformed und alles rund um den Timer t kannst du dir auch sparen, wenn die drei Zeilen Inhalt von actionPerformed ans Ende von keyPressed (ausserhalb der if´s) gibst.

    3) Eben bei diesen drei Zeilen würde ich repaint als letztes aufrufen, also die Koordinaten zuerst verändern.

    Das wars.
    Jetzt hast du einen schwarzen Kreis, den du mit den Pfeiltasten steuern kannst.
     

  3. #3
    celtx celtx ist offline Mitglied Bronze
    Registriert seit
    Nov 2010
    Beiträge
    48
    cool danke, mit paint statt paintComponents hats funktioniert. Auf so Plumpe Sachen komm ich meistens nicht.
    Allerdings, bewegt sich der Kreis nicht sondern hängt in der linken oberen Ecke fest wenn ich den Timer wegnehm und den Inhalt von actionPerformed ans Ende von keyPressed setze.
    Bin noch Anfänger im Java coden und hab den Code selbst größtenteils übernommen, aus diesem Grund versteh ich das mit dem Timer auch irgendwie nicht, aber naja, zumindest funktionierts.
     

  4. #4
    Avatar von sheel
    sheel sheel ist gerade online Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.506
    Hast du Punkt 3 auch gemacht?
    Bei mir funktionierts, ich kann den Kreis bewegen.

    Poste sonst deinen geänderten Quelltext nocheinmal, am besten gleich mit der anderen Datei (in der das Main ist).
    Geändert von sheel (21.11.10 um 00:18 Uhr)
     

  5. #5
    celtx celtx ist offline Mitglied Bronze
    Registriert seit
    Nov 2010
    Beiträge
    48
    Ich glaube so hast du es gemeint, jedoch bewegt sich hierbei der Kreis nicht von alleine, und das sollte passieren, vielleicht hab ich aber auch noch was übersehen.

    Der Punkt soll sich übrigens auf einem Spielfeld bewegen welches mit hilfe der hinzugefügten for-Schleifen, in der paint Methode, realisiert wird.
    Allerdings is hier noch irgendwo der Wurm drin, irgendwie is hier der background schwarz und der
    Kreis grau, wenn ich auf ausführen gehe; dabei soll der background aus roten Kästchen auf schwarzem hintergrund bestehn und der Kreis müsste ebenfalls schwarz sein. Komisch!

    Vielleicht hast du da nochn Tip wie man das lösen kann.

    Vielen Dank

    also hier die classe second:
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    
    import javax.swing.*;
    import java.awt.*;
    import java.awt.Event.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    import java.awt.geom.*;
     
    public class second extends JPanel implements ActionListener, KeyListener {
     
     
        double x = 0, y = 0, velx = 0, vely =0;
        
        public second(){
            addKeyListener((KeyListener) this);
            setFocusable(true);
            setFocusTraversalKeysEnabled(false);
        }
     
        public void paint(Graphics g){
            
            
            this.setBackground(Color.BLACK);
            
            super.paint(g);
            
            g.setColor(Color.RED);
            
            int w = getWidth();
            
            int z = getHeight();
            
            for (int x = 0; x < w; ++x) {
            
                for (int y = 0; y < z; ++y) {
                    g.fillRect(x * 50 + x, y * 50 + y, 50, 50);
            
                }}
            
        
            super.paint(g);
            Graphics2D g2 = (Graphics2D) g;
            g2.fill(new double+java.sun.com&btnI=I%27m%20Feeling%20Lucky">Ellipse2D.Double(x, y, 40, 40));
        
            
            
    }
        
        
        public void up() {
            vely= -1.5;
            velx= 0;
        }
        
        public void down() {
            vely= 1.5;
            velx= 0;
        }
        
        
        
        public void left() {
            velx= -1.5;
            vely= 0;
        }
        
        
        
        public void right() {
            velx= 1.5;
            vely= 0;
        }
        
        public void keyPressed(KeyEvent e){
            int code = e.getKeyCode();
            if (code == KeyEvent.VK_UP){
                up();
            }
            if (code == KeyEvent.VK_DOWN){
                down();
            }
            if (code == KeyEvent.VK_RIGHT){
                right();
            }
            if (code == KeyEvent.VK_LEFT){
                left();
            }
            
            repaint();
            x += velx;
            y += vely;
            
        }
        public void keyTyped(KeyEvent e) {
            
        }
        public void keyReleased(KeyEvent e){
            
        }
    }



    und hier ist die Mainklasse:
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    import javax.swing.JFrame;
     
    public class key {
        
        public static void main(String args[]){
            JFrame f = new JFrame();
            second s = new second();
            f.add(s);
            f.setVisible(true);
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.setSize(800,600);
        }
        
    }
     

  6. #6
    Avatar von sheel
    sheel sheel ist gerade online Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.506
    Was willst du am Ende eigentlich erreichen?
     

  7. #7
    celtx celtx ist offline Mitglied Bronze
    Registriert seit
    Nov 2010
    Beiträge
    48
    Soll nen Spiel werden. Nennt sich Liz Race. Zwei Schlangen bewegen sich von alleine auf dem Spielfeld. Beide Spieler steuern je eine Schlange mit der Tastatur, wobei sie sich nicht berühren dürfen, sonst is game over.
     

Ähnliche Themen

  1. KeyListener
    Von Iroque im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 2
    Letzter Beitrag: 31.10.11, 13:02
  2. swt keylistener
    Von Drizztd im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 9
    Letzter Beitrag: 31.05.10, 19:38
  3. SWT keylistener
    Von darksmilie im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 5
    Letzter Beitrag: 23.11.07, 12:25
  4. KeyListener
    Von SirWayne im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 3
    Letzter Beitrag: 11.04.06, 14:54
  5. KeyListener
    Von zerix im Forum Java
    Antworten: 12
    Letzter Beitrag: 17.10.05, 12:35