Java认为方法是静态的?
出于某种原因,当我试图在一个动作中从另一个类调用非静态方法时,我得到一个错误,说我不能在静态方法中调用非静态方法。但是,我从未将动作或其父对象定义为静态。为什么会出现这个错误Java认为方法是静态的?,java,methods,static,non-static,Java,Methods,Static,Non Static,出于某种原因,当我试图在一个动作中从另一个类调用非静态方法时,我得到一个错误,说我不能在静态方法中调用非静态方法。但是,我从未将动作或其父对象定义为静态。为什么会出现这个错误 import javax.swing.*; import java.awt.*; import java.awt.event.*; public class KeyListenerFrame extends JFrame implements KeyListener { Gri
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() 你到底想在这里做什么:
ColorPanel.moveLeft();
ColorPanel是一个类,而它应该是一个实例
您可能打算做的是(假设showKey是在ColorPanel中定义的):
编辑以添加以下内容:
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);
你会有你的推荐人。然后调用panel.moveLeft()而不是ColorPanel.moveLeft()您在这里到底想做什么:
ColorPanel.moveLeft();
ColorPanel是一个类,而它应该是一个实例
您可能打算做的是(假设showKey是在ColorPanel中定义的):
编辑以添加以下内容:
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);
你会有你的推荐人。然后调用panel.moveLeft()而不是ColorPanel.moveLeft()问题在于,您试图像访问静态方法一样访问它。您需要创建类的实例,然后通过实例调用moveLeft()
还可以创建对ColorPanel对象的全局引用。这将是调用moveLeft()的ColorPanal类的实例。问题在于,您试图像访问静态方法一样访问它。您需要创建类的实例,然后通过实例调用moveLeft() 还可以创建对ColorPanel对象的全局引用。这将是调用moveLeft()的ColorPanal类的实例 我收到一个错误,说我不能打电话给 静态方法中的非静态方法 不,你没有。没有这样的消息,也没有这样的错误。您会收到一个错误,提示“无法从静态上下文引用非静态方法() 我收到一个错误,说我不能打电话给 静态方法中的非静态方法
不,你没有。没有这样的消息,也没有这样的错误。您会收到一个错误,说明“无法从静态上下文引用非静态方法method()”是否可以发布错误以及ColorPanel的外观?是否可以发布错误以及ColorPanel的外观?ColorPanel类中有一个方法moveLeft,它在屏幕上向左移动一个点。我应该换个说法吗?是的。。。这将获取封闭实例。您也可以只执行moveLeft(),因为它将转到下一个封闭实例。。。KeyListenerFrame.java:44:不是封闭类:ColorPanel ColorPanel.this.moveLeft();在ColorPanel中未定义showKey。该初始化代码在showKey(预期)内部和actionPerformed(找不到符号)内部都不起作用。在ColorPanel类中有一个方法moveLeft,它在屏幕上向左移动一个点。我应该换个说法吗?是的。。。这将获取封闭实例。您也可以只执行moveLeft(),因为它将转到下一个封闭实例。。。KeyListenerFrame.java:44:不是封闭类:ColorPanel ColorPanel.this.moveLeft();在ColorPanel中未定义showKey。该初始化代码在showKey(预期)和actionPerformed(找不到符号)中都不起作用。很抱歉,我编写它时没有查看实际错误。你知道怎么补救吗?@Bro mcBro:你可以编辑你的帖子。如果你指的是纠正错误,请看约翰的回答。对不起,我写这篇文章时没有考虑实际的错误。你知道怎么补救吗?@Bro mcBro:你可以编辑你的帖子。如果你指的是纠正错误,请参阅约翰的答案。