Java 如何修复JFrame未打开,编译器未给出错误,如何修复?

Java 如何修复JFrame未打开,编译器未给出错误,如何修复?,java,swing,jframe,Java,Swing,Jframe,[技术上不是[复制]]我知道以前发生过这种情况(有一个错误,当我编译游戏时,我的JFrame无法打开,我如何修复这个[复制]),MadProgrammer回答说:“game.main没有做任何事情。因为它是程序的主要入口点,它需要做一些事情才能发生事情。”但是现在Game.main做了一些事情,我看不出答案 我试着重新编译并检查错误,没有,甚至有人让它工作。我怎样才能解决这个问题 Game.java: package com.hypopixel; import java.awt.*; imp

[技术上不是[复制]]我知道以前发生过这种情况(有一个错误,当我编译游戏时,我的JFrame无法打开,我如何修复这个[复制]),MadProgrammer回答说:“game.main没有做任何事情。因为它是程序的主要入口点,它需要做一些事情才能发生事情。”但是现在Game.main做了一些事情,我看不出答案

我试着重新编译并检查错误,没有,甚至有人让它工作。我怎样才能解决这个问题

Game.java:

package com.hypopixel;

import java.awt.*;

import javax.swing.*;

import java.applet.*;

public class Game extends Canvas implements Runnable {

    public static final long serialVersionUID = 1L;

    private Thread thread;
    private Boolean running = false;

    public Game() {
        new Window(800, 600, this);
    }

    public synchronized void start() {
        thread = new Thread(this);
        thread.start();
        running = true;
    }
    public synchronized void stop() {
        try {
            thread.join();
            running = false;
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

    public void run() {
    }

    public static void main(String[] args) {
        new Game();
    }
}
Window.java:

package com.hypopixel;

import java.awt.*;
import javax.swing.*;
import java.applet.*;

public class Window extends Canvas {

    public static int BlockSizing = 4;

    public static final long serialVersionUID = 1L;

    public Window(int Wwidth, int Wheight, Game game) {
        JFrame Window = new JFrame();
        setPreferredSize(new Dimension(Wwidth, Wheight));
        setMinimumSize(new Dimension(800, 600));
        Window.add(game);
        Window.pack();
        Window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Window.setTitle("HypoPixel");
        Window.setLocationRelativeTo(null);
        Window.setVisible(true);
        game.start();
    }
}
/*

Credits:

Just another Java Programmer

MadProgrammer

*/
manifest.txt是相同的


我希望JFrame会打开(因为其他人能够打开),但它不会打开。

因此,有很多东西“关闭”

public Window(int Wwidth, int Wheight, Game game) {
    JFrame Window = new JFrame();
    setPreferredSize(new Dimension(Wwidth, Wheight));
    setMinimumSize(new Dimension(800, 600));
    Window.add(game);
    Window.pack();
    Window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    Window.setTitle("HypoPixel");
    Window.setLocationRelativeTo(null);
    Window.setVisible(true);
    game.start();
}
除了在
java.awt
中已经有一个名为
Window
的类这一事实令人费解之外,您还使用了变量名
Window
,这一点更令人费解

窗口
扩展自
画布
,但您从未实际使用过它。调用
setPreferredSize
setMinimumSize
是因为
Window
实际上从未添加到任何内容中,通常建议不要这样做,而是倾向于覆盖这些方法,以防止意外更改其值

游戏
,您可以调用
窗口
。。。这是一种奇怪的做事方式,因为制造窗口并不是游戏的责任,相反,这是另一种方式

就个人而言,我会从一个专门的入口点开始,其职责是加载和准备环境,并显示第一个屏幕,例如

import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Main {

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new Game());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

}
确保so's
Main类
属性指向该类

我还将更新
游戏
,因此它将覆盖
getPreferredSize
。我还要看看你的
start
stop
方法

public synchronized void start() {
    thread = new Thread(this);
    thread.start();
    running = true;
}
如果调用两次会发生什么?在创建新线程之前,您应该检查
线程的状态

public synchronized void stop() {
    try {
        thread.join();
        running = false;
    } catch(Exception e) {
        e.printStackTrace();
    }
}
这不会起任何作用,因为
join
正在阻塞,因此
运行的状态永远不会改变

此外,由于Java的内存模型,您可能会发现,即使在调用
join
之前将
running
设置为
false
,也不起作用。相反,您应该使用(并且使用
布尔值可能会导致一系列其他问题,因为您引用的是内存位置而不是实际值)

我建议大家通读一遍

我使用的IDE(NetBeans)不允许我运行java文件

从“项目”选项卡中,选择
Main
class/Java文件,右键单击并选择“运行文件”

或者,在编辑器中打开
Main
(并选中)时,按Shift+F6

接下来,确保将
com.hypopixel.Main
设置为项目“主类”

  • 右键单击“项目”选项卡中的项目节点,然后选择“属性”

  • 从右侧下方的选项中选择“运行”,验证“主类”是否设置为
    com.hypopixel.Main
    ,如果未设置,请单击浏览。。。并从可用选项中选择它

对我来说,它会打开,虽然是最小尺寸(只有一个标题栏和一些图标)。最小大小是因为您在
窗口
实例上设置了最小和首选大小,但从未将其添加到
JFrame
。在
JFrame
中添加
Game
实例,但不设置最小和首选大小。谢谢,我没有意识到有多少是无效的!也许我使用的代码已经过时了,这就是我的来源:“,过时了?@Cylelin我反复提到的一个问题是,youtube教程往往很糟糕,根据我的经验,它们不是为了教“好的”实践,而是为了展示“如何”实现特定目标。例如,在上面的代码中,我认为
Game
不应该负责管理线程,这是核心引擎的部分职责,
Game
实际上应该只关注渲染表面,但那就是我。而且,是的,我们收到了很多“我正在关注youtube视频…”的问题,这些问题的答案往往是“不要关注它”;)你能告诉我如何找到制作3D游戏的教程吗?另外,您提供的代码不会产生JFrame。@Cylelin在我个人的建议中,是将重点放在解决“a”问题上,然后找出这一部分如何适合整个拼图。“主循环”得到了充分的记录和讨论,更新状态,呈现状态,fps计算,重复;实体管理被广泛讨论。我会尝试查看可用的、开源的引擎,它们会给你提供很多有用的信息和想法,也许会专注于使用一个或两个,看看它们的区别是什么,以及你可能如何使用它们them@CyleLinin您似乎需要的是一个关于Netbeans的好教程
import java.awt.Canvas;
import java.awt.Dimension;
import java.util.concurrent.atomic.AtomicBoolean;

public class Game extends Canvas implements Runnable {

    public static final long serialVersionUID = 1L;

    private Thread thread;
    private AtomicBoolean running = new AtomicBoolean(false);

    public Game() {
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(800, 600);
    }

    public synchronized void start() {
        running.set(true);
        if (thread == null) {
            thread = new Thread(this);
            thread.start();
        }
    }

    public synchronized void stop() {
        running.set(false);
        if (thread == null) {
            return;
        }
        try {
            thread.join();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void run() {
    }
}