gpt4 book ai didi

java - 如何修复我的 JFrame 无法打开,编译器没有给我错误,我该如何修复它?

转载 作者:行者123 更新时间:2023-12-02 10:19:03 25 4
gpt4 key购买 nike

[技术上不是]我知道这种情况以前发生过(有一个错误,当我编译游戏时,我的 JFrame 无法打开,我该如何解决这个问题),MadProgrammer 回答:“Game. main 没有做任何事情。由于它是程序的主要入口点,因此在发生某些事情之前它需要做一些事情”,但现在 Game.main 做了一些事情,我看不到答案。

我尝试重新编译并检查错误,没有,其他人甚至让它工作。我该如何解决这个问题

游戏.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();
}
}

窗口.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 >,这更令人困惑。

Window 扩展自 Canvas,但您从未真正使用过它。调用 setPreferredSizesetMinimumSize 因为 Window 实际上从未添加到任何内容中,并且通常建议不要这样做,而是倾向于重写这些方法,以便以防止意外更改其值。

Game 中,您调用 Window ...这是一种奇怪的做事方式,因为它实际上并不是 Game 的责任相反,要制作 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);
}
});
}

}

确保 manufest.mf这样它的 Main-Class 属性就指向这个类。

我还会更新 Game,因此它会覆盖 getPreferredSize。我还会查看您的 startstop 方法。

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 处于阻塞状态,因此 running 的状态永远不会改变。

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

我建议通读一下Concurrency

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() {
}
}

the IDE I use (NetBeans) will not let me run the java file

从“Projects”选项卡中,选择Main类/Java文件,右键单击并选择“Run File”

Run file in netbeans

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

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

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

Properties

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

Options

关于java - 如何修复我的 JFrame 无法打开,编译器没有给我错误,我该如何修复它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54467239/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com