[技术上不是[重复]],我知道这已经发生过了(有一个错误,我编译游戏时无法打开JFrame,我该如何解决此问题[重复]),MadProgrammer回答:“游戏。 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开(Cuase别人能得到它),它不会打开。
答案 0 :(得分:1)
所以,有些事情“不对”
从...开始...
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();
}
除了Window
中已经存在一个名为java.awt
的类而使人困惑的事实之外,您还使用了变量名Window
,这使人更加困惑。
Window
源自Canvas
,但您从未真正使用过它。之所以调用setPreferredSize
和setMinimumSize
是因为Window
实际上从未添加到任何东西,通常建议不要这样做,而建议改写这些方法,以防止意外更改其值。>
在Game
中,您打电话给Window
...这是一种奇怪的处理方式,因为Game
并不是真正负责创建窗口,而是反之亦然。
我个人将从一个专用的入口点开始,例如,它的职责是加载和准备环境并显示第一个屏幕...
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
。我还将看看您的start
和stop
方法。
public synchronized void start() {
thread = new Thread(this);
thread.start();
running = true;
}
如果两次调用该怎么办?在创建新Thread
之前,您应该先检查public synchronized void stop() {
try {
thread.join();
running = false;
} catch(Exception e) {
e.printStackTrace();
}
}
的状态。
join
这不会做任何事情,因为running
正在阻止,所以running
的状态将永远不会改变。
此外,由于Java的内存模型,您可能会发现即使在调用false
之前将join
设置为Boolean
也不起作用。相反,您应该使用atomic variable(并且使用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() {
}
}
可能会引起很多其他问题,因为您引用的是内存位置而不是实际值)
我建议您通读Concurrency
Main
我使用的IDE(NetBeans)不允许我运行Java文件
从“项目”标签中,选择Main
类/ Java文件,右键单击并选择“运行文件”
或者,在编辑器中打开com.hypopixel.Main
(并选择),然后按 Shift + F6
接下来,确保将com.hypopixel.Main
设置为项目“主类”
fruit="apple"
echo $fruit | cut -c1-3
variable=$"{echo $fruit | cut -c1-3}"
,如果未设置,请单击“ 浏览... ”,然后从可用选项