Java游戏不起作用

时间:2014-04-04 17:35:09

标签: java eclipse swing

所以这是我的游戏......

import javax.swing.JFrame;

public class Main extends JFrame {

    //the parts of the game like the parts in a desktop
    public void Skeleton() {
        //entry point of the game
    add(new Board());
    // sets the title
        setTitle("Skeleton");
        // makes it safe for the program to close without leaks
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        //sets the size
        setSize(300, 280);
        //sets the location
        //null means middle
        setLocationRelativeTo(null);
        //set the window to be visible
        setVisible(true);
        //allows the window to be resized if the statement is true
        setResizable(false);
    }

    //wraps everything up
    public static void main(String[] args) {
        new Skeleton();
    }
}

new Skeleton();出错,错误显示

  

无法将骨架解析为类型

4 个答案:

答案 0 :(得分:2)

您的Skeletonmethod,而不是class。只能实例化类。我相信你要做的就是:

public static void main(String[] args) {
    Main mainFrame = new Main();
    mainFrame.Skeleton(); // I assume you were trying to ultimately call this method.
}

附注:在Java中,标准是以小写字母开头的方法,因此Skeleton应为skeleton。从技术上讲,两者在语法上都是有效的,但正如我所说的那样,后者是标准的,它使得其他人(甚至你自己)更容易看到你的代码,在遵循标准时快速阅读和理解它。实际上,我发现当你混合这样的案例时,很难知道你何时查看一个类,方法或对象。

编辑:正如JasonC指出的那样,StackOverflow语法高亮显示器在出现不正确的情况时会感到非常困惑,这与我在上一段中提到的情况相符,这使得其他人阅读起来更加困难(特别是一目了然)。

答案 1 :(得分:2)

您似乎正在尝试为班级定义constructor;但构造函数不应该具有返回类型,并且必须与封闭类的名称相同。您可以将类名从Main更改为Skeleton并修复构造函数语法,例如:

public class Skeleton extends JFrame { // <- name changed

    public Skeleton () { // <- no 'void'
        ...
    }

    public static void main(String[] args) {
        Skeleton s = new Skeleton();
        // do stuff with 's'
    }
}

你可以做同样的事情,但保留名称Main

public class Main extends JFrame { 

    public Main () { // <- no 'void'
        ...
    }

    public static void main(String[] args) {
        Main m = new Main(); // <- use 'Main' not 'Skeleton'
        // do stuff with 'm'
    }
}

或者您可以不使用构造函数并保持代码不变,而是将Skeleton()作为实例方法调用,如此处的其他答案所示,例如:

public class Main extends JFrame { 

    public void Skeleton () {
        ...
    }

    public static void main(String[] args) {
        Main m = new Main();
        m.Skeleton(); // <- `Skeleton()` is an instance method
        // do stuff with 'm'
    }

}

...但是查看你的代码(通常是在构造函数中完成这种工作)并猜测你的new Skeleton()意图,看起来上面的构造函数示例之一就是你想要的。在构造之后在单独的方法中执行初始化通常不是最好的处理方式(有时候这种情况很有用,但是大多数情况下它会使代码更清晰,更清晰,并避免可能的错误,例如忘记初始化类在你构建之后)。

答案 2 :(得分:1)

Jason CPaul Richter所述,Skeleton是method而不是class,因此您无法初始化Skeleton()。因此,要么将您的班级更改为Skeleton,要么创建Main的对象并调用该方法。我只是想添加一个使用SwingUtility.invokeLater()来调用所有swing的东西,这样你就可以做到这样的事情。

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {         
        public void run() {
            Main frame = new Main();
            frame.Skeleton();
        }
    });
}

答案 3 :(得分:0)

new Main().Skeleton();
    ^^^^^   ^^^^^^^^^
 Class Name  instance method.

你最需要写的东西。

Skeleton是一种公共方法,您可以通过该类的实例进行访问。在java new <className>()中创建该类的新对象。

代码段:

Main main = new Main();
main.Skeleton();