Java Eclipse告诉我,我的方法不是静态的

时间:2015-04-03 17:35:27

标签: java eclipse swing static non-static

我不知道我是否遗漏了一些非常基本的东西,但我有一个静态方法返回一个静态整数,我试图分配给一个不同的静态整数。我的代码是静态的,因为它可以得到但我不断收到错误告诉我,"无法从类型KeyboardInput"中对非静态方法getX()进行静态引用。 (方法和类的名称只是为了清楚说明)它告诉我解决方案是使方法保持静态,但它已经完全丢失了。

以下是代码:

使用该方法的类 -

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Window extends JFrame{

    JPanel panel;
    ImageIcon imgIcon;
    JLabel label;

    private static int xLoc = KeyboardInput.getX(); // errors on this line
    private static int yLoc = KeyboardInput.getY(); // and errors on this line


    public Window(String name){
        super(name);

        setExtendedState(JFrame.MAXIMIZED_BOTH);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(null);

        //addKeyListener(new KeyboardInput());

        panel = new JPanel();       
        imgIcon = new ImageIcon("rorschach.jpg");
        label = new JLabel(imgIcon);
        label.setLocation(xLoc, yLoc);
        label.setSize(50,50);

        panel.add(label);
        add(panel);

        setVisible(true);

    }
}

制作方法的类 -

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.Timer;

public class KeyboardInput implements KeyListener, ActionListener {

    private boolean goUp = false;
    private boolean goDown = false;
    private boolean goLeft = false;
    private boolean goRight = false;

    private static int x = 0;
    private static int y = 0;

    public static int getX(){
        return x;
    }

    public static int getY(){
        return y;
    }

    Timer timer;

    public KeyboardInput(){
         timer = new Timer(100, this);
    }

    @Override
    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_W) {
            goUp = true;
        }
        if (e.getKeyCode() == KeyEvent.VK_S) {
            goDown = true;
        }
        if (e.getKeyCode() == KeyEvent.VK_A) {
            goLeft = true;
        }
        if (e.getKeyCode() == KeyEvent.VK_D) {
            goRight = true;
        }
    }

    @Override
    public void keyReleased(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_W) {
            goUp = false;
        }
        if (e.getKeyCode() == KeyEvent.VK_S) {
            goDown = false;
        }
        if (e.getKeyCode() == KeyEvent.VK_A) {
            goLeft = false;
        }
        if (e.getKeyCode() == KeyEvent.VK_D) {
            goRight = false;
        }
    }

    @Override
    public void keyTyped(KeyEvent e) {

    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (goUp) {
            y -= 5;
        }
        if (goDown) {
            y += 5;
        }
        if (goLeft) {
            x -= 5;
        }
        if (goRight) {
            x += 5;
        }
        if (goUp && goDown) {
            y += 5;
        }
        if (goLeft && goRight) {
            x += 5;
        }
    }

}

这个项目显然没有完成,但我不相信我此时会遇到这些错误,希望能解决这个问题。

提前致谢!

2 个答案:

答案 0 :(得分:0)

我猜你不需要以下几行中的静态词:

private static int xLoc = KeyboardInput.getX(); // errors on this line

private static int yLoc = KeyboardInput.getY();

答案 1 :(得分:0)

不是答案,但我无法在评论中格式化代码。

这看起来非常糟糕:

public class Window extends JFrame{

    ...
    private static int xLoc = ...;
    private static int yLoc = ...;

    public Window(String name) { ... }
    ...
}

您已经定义了一个允许您创建Window个实例的构造函数。

Window个实例具有名称并且它们扩展JFrame这一事实看起来非常像是邀请多个实例,但每个Window实例共享相同的xLocyLoc以及其他Window个实例。

这有什么意义呢?