Java думает, что метод является статическим? - PullRequest
1 голос
/ 04 мая 2011

По какой-то причине, когда я пытаюсь вызвать нестатический метод из другого класса в действии, я получаю сообщение об ошибке, в котором говорится, что я не могу вызвать нестатический метод в статическом методе. Тем не менее, я никогда не определял действие или его родителей как статичные. Почему я получаю эту ошибку?

    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);
      }

это та часть, которая доставляет мне неприятности

      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();
        }
    } */
}

Ошибка, сгенерированная из ColorPanel.moveLeft (); is: KeyListenerFrame.java:51: на нестатический метод moveLeft () нельзя ссылаться из статического контекста ColorPanel.moveLeft ();

Ответы [ 3 ]

8 голосов
/ 04 мая 2011

Что именно вы пытаетесь сделать здесь:

   ColorPanel.moveLeft();

ColorPanel - это класс, когда он должен быть экземпляром.

То, что вы, возможно, намереваетесь сделать (при условии showKeyопределяется в ColorPanel):

   ColorPanel.this.moveLeft();

Изменить, чтобы добавить следующее:

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

Здесь создается ColorPanel, но ссылка не сохраняется.

Если вы переместите панель ColorPanel за пределы jbInit, а затем инициализируете ее как

panel = new ColorPanel(Color.lightGray);

, у вас будет ссылка.Затем вместо ColorPanel.moveLeft () вызовите panel.moveLeft ()

0 голосов
/ 05 мая 2011

Я получаю сообщение о том, что не могу позвонить нестатический метод в статическом методе

Нет, нет. Нет такого сообщения и нет такой ошибки. Вы получаете сообщение о том, что «на метод нестатического метода () нельзя ссылаться из статического контекста . '

0 голосов
/ 04 мая 2011

Проблема в том, что вы пытаетесь получить к нему доступ, как если бы это был статический метод.Вам нужно создать экземпляр класса, а затем через экземпляр, который вы вызываете moveLeft ().

Также создать глобальную ссылку на ваш объект ColorPanel.Это будет экземпляр класса ColorPanal, для которого вы вызываете moveLeft ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...