java - public static void main(String[] args) 应该放在哪里?

标签 java swing jpanel program-entry-point

我是java新手,在尝试创建一个小型蛇类游戏后,发生了错误

Error: Main method not found in class Game.GamePanel, please define the main method as: public static void main(String[] args)"

有人可以帮我解决这个错误吗?对于java初学者来说,这将是一个很大的帮助。我使用的是 Eclipse 最新版本

package Game;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.util.ArrayList;

import javax.swing.JPanel;

public class GamePanel extends JPanel implements Runnable, KeyListener {
    public static final int WIDTH = 1000;
    public static final int HEIGHT = 1000;
    //Render
    private Graphics2D g2d;
    private BufferedImage image;

    //GameLoop
    private Thread thread;
    private boolean running;
    private long targetTime;

    //Game Stuff
    private final int SIZE = 10;
    Entity head;
    ArrayList<Entity> snake;

    //movement
    private int dx, dy;

    //key input
    private boolean up,down,right,left,start;

    public GamePanel() {
        setPreferredSize(new Dimension(WIDTH, HEIGHT));
        setFocusable(true);
        requestFocus();
        addKeyListener(this);
    }
    public void addNotify() {
        super.addNotify();
        thread = new Thread(this);
        thread.start();
    }
    private void setFPS(int fps) {
        targetTime = 1000 / fps;
    }

    @Override
    public void keyTyped(KeyEvent e) {


    }

    @Override
    public void keyPressed(KeyEvent e) {
        int k = e.getKeyCode();

        if(k == KeyEvent.VK_UP) up = true;
        if(k == KeyEvent.VK_DOWN) down = true;
        if(k == KeyEvent.VK_LEFT) left = true;
        if(k == KeyEvent.VK_RIGHT) right = true;
        if(k == KeyEvent.VK_ENTER) start = true;

    }

    @Override
    public void keyReleased(KeyEvent e) {
        int k = e.getKeyCode();

        if(k == KeyEvent.VK_UP) up = false;
        if(k == KeyEvent.VK_DOWN) down = false;
        if(k == KeyEvent.VK_LEFT) left = false;
        if(k == KeyEvent.VK_RIGHT) right = false;
        if(k == KeyEvent.VK_ENTER) start = false;

    }

    @Override
    public void run() {
        if(running) return;
        init();
        long startTime;
        long elapsed;
        long wait;
        while(running){
            startTime = System.nanoTime();

            update();
            requestRender();

            elapsed = System.nanoTime() - startTime;
            wait = targetTime - elapsed / 1000000;
            if(wait > 0) {
                try {
                    Thread.sleep(wait);
                }catch(Exception e) {
                    e.printStackTrace();
                }
            }
        }

    }
    private void init() {
        image = new BufferedImage(WIDTH,HEIGHT,BufferedImage.TYPE_INT_ARGB);
        g2d = image.createGraphics();
        running = true;
        setUplevel();
        setFPS (10);
    }
    private void setUplevel() {
        snake = new ArrayList<Entity>();
        head = new Entity(SIZE);
        head.setPosition(WIDTH / 2, HEIGHT / 2);
        snake.add(head);

        for(int i = 1;i < 10;i++) {
            Entity e = new Entity(SIZE);
            e.setPosition(head.getX() + (i * SIZE), head.getY());
            snake.add(e);
        }

    }
    private void requestRender() {
        render(g2d);
        Graphics g = getGraphics();
        g.drawImage(image, 0,0,null);
        g.dispose();    
    }

    private void update() {
        if(up && dy == 0) {
            dy = -SIZE;
            dx = 0;
        }
        if(down && dy == 0) {
            dy = SIZE;
            dx = 0;
        }
        if(left && dx == 0) {
            dy = 0;
            dx = -SIZE;
        }
        if(right && dx == 0) {
            dy = 0;
            dx = SIZE;
        }

            if(dx != 0 || dy != 0) {
            for(int i =  snake.size() - 1;i > 0;i--) {

                snake.get(i).setPosition(
                        snake.get(i - 1).getX(),
                        snake.get(i - 1).getY()
                        );
            }
            head.move(dx, dy);
        }



        if(head.getX() < 0 ) head.getX(WIDTH);
        if(head.getY() < 0 ) head.getY(HEIGHT);
        if(head.getX() > WIDTH ) head.getX(0);
        if(head.getY() > HEIGHT ) head.getY (0);
    }

    public void render(Graphics2D g2d) {
         g2d.clearRect(0, 0, WIDTH, HEIGHT);

         g2d.setColor(Color.GREEN);
         for(Entity e : snake) {
             e.render(g2d);
         }

    }

}

最佳答案

您可以将其添加到 GamePanel,但您需要创建一个 JFrame 并且想要向其中添加 GamePanel 的实例。比如,

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            JFrame frame = new JFrame();
            frame.add(new GamePanel());
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);
        }
    });
}

关于java - public static void main(String[] args) 应该放在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59296160/

相关文章:

java - war 文件的大小是否会以某种方式影响应用程序和/或应用程序服务器的性能?

java - SwingUtilities.windowForComponent(JFrame) 返回 null

java - 存在 JMenu 时 JPanel#paintChildren(Graphics) 的行为不正确?

java - 我可以将 CSS 应用于 swing 文本组件吗?

java - 使用 MouseListener 绘制加权树

java - 刷新 JPanel

java - 如何将 JLabel 添加到另一个类的 JFrame 中?

java - 使用 Collections 制作 Array List 线程是否存在任何性能问题。同步列表?

java - 寻求设计负载测试的帮助

java - 在Java中自动生成域类(具有与grails域类类似的功能)