2011-05-04 2 views
1

Pour une raison quelconque, lorsque j'essaie d'appeler une méthode non statique d'une autre classe dans une action, j'obtiens une erreur indiquant que je ne peux pas appeler une méthode non statique dans une méthode statique. Cependant, je n'ai jamais défini l'action ou ses parents comme statiques. Pourquoi ai-je cette erreur?Java pense qu'une méthode est statique?

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

    public class KeyListenerFrame extends JFrame implements KeyListener { 
     GridLayout gridLayout1 = new GridLayout(); 
     JPanel listenerPan = new JPanel(); 

     public KeyListenerFrame() { 
     try { 
      jbInit(); 
      listenerPan.addKeyListener(this); 
      addWindowListener(new WindowAdapter() { 
      public void windowClosing(WindowEvent e) { 
       System.exit(0); 
    } 
    });  
    listenerPan.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_UP,0,true), "showKey"); 
    listenerPan.getActionMap().put("showKey", showKey); 
    listenerPan.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_D, 0, true), "showKey"); 

} 
catch(Exception e) { 
    e.printStackTrace(); 
     } 
     } 
     public static void main(String[] args) { 
     KeyListenerFrame klf = new KeyListenerFrame(); 
     klf.setBounds(10,10,500,500); 
     klf.setVisible(true); 
     klf.focusPanel(); 

     } 
     public void focusPanel() { 
     listenerPan.requestFocus(); 
     } 
     private void jbInit() throws Exception { 
     this.getContentPane().add(listenerPan, null); 
     ColorPanel panel = new ColorPanel(Color.lightGray); 
     this.getContentPane().add(panel); 
     } 

c'est la partie qui me donne mal à

 Action showKey = new AbstractAction() { 
     public void actionPerformed(ActionEvent e) { 
     ColorPanel.moveLeft(); 
     } 
     }; 


     public void keyTyped(KeyEvent e) { 
     System.out.println(e.toString()); 
     } 
     public void keyPressed(KeyEvent e) { 
     System.out.println(e.toString()); 
     } 
     public void keyReleased(KeyEvent e) { 
     System.out.println(e.toString()); 
     } 
    } 

ColorPanel.java

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
import java.awt.Component.*; 
import java.awt.Container.*; 
import javax.swing.JComponent.*; 

public class ColorPanel extends JPanel{ 

    public Circle circle; 
    private javax.swing.Timer timer; 

    public ColorPanel(Color backColor){ 
     int width = 500; 
     int height = 500; 
     setBackground(backColor); 
     setPreferredSize(new Dimension(width, height)); 

     circle = new Circle(width/2, height/2, 50, Color.red); 
     circle.setVelocity(5); 
     addMouseListener(new MoveListener()); 
    } 

    public void paintComponent(Graphics g){ 
     super.paintComponent(g); 
     circle.fill(g); 
    } 

    public void moveLeft(){ 
     circle.move(); 
     repaint(); 
    } 

    /* public class MoveListener extends MouseAdapter{ 

     public void mousePressed(MouseEvent e){ 
      circle.move(); 
      repaint(); 
     } 
    } 


    private class MoveListener implements ActionListener{ 

     public void actionPerformed(ActionEvent e){ 
      circle.move(); 
      //circle.turn(1); 
      repaint(); 
     } 
    } */ 
} 

L'erreur générée à partir du ColorPanel.moveLeft(); est: KeyListenerFrame.java:51: méthode non statique moveLeft() ne peut pas être référencé à partir d'un contexte statique ColorPanel.moveLeft();

+0

pourriez-vous poster l'erreur –

+0

et aussi à quoi ressemble ColorPanel? – asgs

Répondre

8

Qu'exactement vous essayez de faire ici:

ColorPanel.moveLeft(); 

ColorPanel est une classe, alors qu'elle devrait être une instance.

Ce que vous pouvez être l'intention de le faire est (en supposant showkey est défini dans ColorPanel):

ColorPanel.this.moveLeft(); 

Modifier Pour ajouter les éléments suivants:

private void jbInit() throws Exception { 
    this.getContentPane().add(listenerPan, null); 
    ColorPanel panel = new ColorPanel(Color.lightGray); 
    this.getContentPane().add(panel); 
} 

ColorPanel est créé ici, mais une référence n'est pas gardé.

Si vous déplacez le panneau ColorPanel en dehors de jbInit, puis l'initialiser comme

panel = new ColorPanel(Color.lightGray); 

vous aurez votre référence. Puis au lieu de ColorPanel.moveLeft() appel panel.moveLeft()

+0

À l'intérieur de la classe ColorPanel, il y a une méthode moveLeft qui déplace un point sur l'écran. Devrais-je l'appeler différemment? –

+0

Ouais ... ColorPanel.this vous obtient l'instance englobante. Vous pouvez également faire simplement moveLeft() car cela ira jusqu'à l'instance englobante suivante. –

+0

Lorsque j'essaie que je reçois ... KeyListenerFrame.java:44: pas une classe englobante: ColorPanel ColorPanel.this.se déplacer à gauche(); ShowKey n'est pas défini dans ColorPanel. –

0

Le problème est que vous essayez d'y accéder comme si vous étiez une méthode statique. Vous devez créer une instance de la classe, puis à travers l'instance que vous appelez moveLeft().

Créez également une référence globale à votre objet ColorPanel. Ce serait l'instance de la classe ColorPanal que vous appelez moveLeft() on.

0

je reçois une erreur disant que je ne peux pas appeler un méthode non statique dans une méthode

statique Non, vous ne le faites pas. Il n'y a pas un tel message et pas une telle erreur. Vous obtenez une erreur indiquant que la méthode de méthode non statique() ne peut pas être référencée à partir d'un contexte statique.

+0

Je suis désolé, je l'ai écrit sans regarder l'erreur réelle. Une idée de comment remédier à cela? –

+0

@Bro mcBro: vous pouvez éditer votre message. Si vous parlez de remédier à l'erreur *, voyez la réponse de John. – EJP

Questions connexes