1

何らかの理由で、アクションで別のクラスから非静的メソッドを呼び出そうとすると、静的メソッドで非静的メソッドを呼び出すことはできないというエラーが表示されます。ただし、アクションまたはその親を静的と定義したことはありません。なぜこのエラーが発生するのですか?

    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(); から生成されたエラー。: KeyListenerFrame.java:51: 非静的メソッド moveLeft() は、静的コンテキスト ColorPanel.moveLeft() から参照できません。

4

3 に答える 3

8

ここで正確に何をしようとしていますか:

   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() を呼び出します

于 2011-05-04T18:02:22.290 に答える
0

問題は、静的メソッドであるかのようにアクセスしようとしていることです。クラスのインスタンスを作成する必要があり、そのインスタンスを介して moveLeft() を呼び出します。

また、ColorPanel オブジェクトへのグローバル参照を作成します。これは、moveLeft() を呼び出す ColorPanal クラスのインスタンスになります。

于 2011-05-04T19:08:00.750 に答える
0

静的メソッドで非静的メソッドを呼び出せないというエラーが表示されます

いいえ、ありません。そのようなメッセージはなく、そのようなエラーもありません。「非静的メソッド method() は静的コンテキストから参照できません」というエラーが表示されます。

于 2011-05-05T00:17:15.213 に答える