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