【问题标题】:Java Eclipse Tells Me that My Method is not StaticJava Eclipse 告诉我我的方法不是静态的
【发布时间】:2015-04-03 17:35:26
【问题描述】:

我不知道我是否遗漏了一些非常基本的东西,但我有一个静态方法,它返回一个静态整数,我试图将它分配给一个不同的静态整数。我的代码是静态的,但我不断收到错误消息,“无法从类型 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;
        }
    }

}

这个项目显然没有完成,但我不认为我现在应该得到这些错误,希望能解决这个问题。

提前致谢!

【问题讨论】:

  • 为我工作。清理并重建。
  • 我有并且我继续收到错误

标签: java eclipse swing static non-static


【解决方案1】:

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

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

private static int yLoc = KeyboardInput.getY();

【讨论】:

  • 是的,请解释一下逻辑,因为 KeybourdInput.getX() 返回的是一个静态整数,那么为什么要从 xLoc 和 yLoc 中删除静态呢?
  • @salilvishnuKapur,“返回静态整数”这句话毫无意义。方法返回一个static 不是一个适用于值的概念。唯一可以是static 的是类的成员(例如,字段、方法和内部类。)
  • 谢谢詹姆斯知道了。
【解决方案2】:

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

这看起来是个非常糟糕的主意:

public class Window extends JFrame{

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

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

您已经定义了一个构造函数,可以让您创建Window 实例。

Window 实例具有名称并且它们扩展 JFrame 的事实看起来很像邀请制作多个实例,但每个 Window 实例与每个实例共享相同的 xLocyLoc其他Window 实例。

这有什么意义?

【讨论】:

  • 我不确定我正在制作的项目,因此添加了“名称”参数以防我想要具有不同标题栏的不同窗口
  • @nicknicknick111,这很好,但我的问题是为什么将xLocyLoc 设为静态?是否有意义?也许您的程序只生成一个Window,因此如果 xLoc 和 yLoc 是静态的,它可能会工作,但是如果您决定将程序更改为拥有两个或更多 Windows,它仍然可以工作吗? static 适用于只有一个实例才有意义的事物(例如 java.lang.System),或者甚至不是 事物 的事物(java.lang.Math)。拥有多个 Window 的程序并没有什么不寻常之处,那么为什么要定义一个只能有一个实例的 Window 类呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-14
  • 1970-01-01
  • 1970-01-01
  • 2012-07-25
相关资源
最近更新 更多