Java &引用;“运行”;方法不起作用
嘿,伙计们,我是Java游戏编程新手,现在正在使用Runnable接口。出于某种原因,我的run()方法从未被调用,我也不知道为什么。我试着把很多System.out.println语句放在那里,但它们从来没有被打印出来。任何帮助都将不胜感激Java &引用;“运行”;方法不起作用,java,swing,runnable,event-dispatch-thread,thread-sleep,Java,Swing,Runnable,Event Dispatch Thread,Thread Sleep,嘿,伙计们,我是Java游戏编程新手,现在正在使用Runnable接口。出于某种原因,我的run()方法从未被调用,我也不知道为什么。我试着把很多System.out.println语句放在那里,但它们从来没有被打印出来。任何帮助都将不胜感激 import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Image; import java.awt.Toolkit; impo
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JPanel;
public class GamePanel extends JPanel implements Runnable
{
private final int WIDTH = 160;
private final int HEIGHT = WIDTH/12 *9;
private final int RATIO = 3;
private Thread animator;
private volatile boolean running;
private volatile boolean gameOver;
private double FPS = 60D;
private double period = 1000/FPS;
private Image dbImage;
private Graphics dbg;
public GamePanel()
{
setPreferredSize(new Dimension(WIDTH *3, HEIGHT*3));
setBackground(Color.WHITE);
setFocusable(true);
requestFocus();
terminate();
}
public void addNotify()
{
super.addNotify();
startGame();
}
public void startGame()
{
System.out.println("Thread started");
animator = new Thread();
animator.start();
}
public void stopGame()
{
System.out.println("Thread stopped");
running = false;
}
public void run()
{
long beforeTime, timeDiff, sleepTime;
beforeTime = System.currentTimeMillis();
System.out.println(beforeTime);
running = true;
while (running)
{
System.out.println("Running");
gameUpdate();
gameRender();
paintScreen();
timeDiff = System.currentTimeMillis() - beforeTime;
sleepTime = (long) period - timeDiff;
if(sleepTime <= 0)
sleepTime = 5;
try
{
Thread.sleep(sleepTime);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
beforeTime = System.currentTimeMillis();
}
System.exit(0);
}
public void gameRender()
{
if (dbImage == null)
{
dbImage = createImage(WIDTH, HEIGHT);
}
else
dbg = dbImage.getGraphics();
dbg.setColor(Color.WHITE);
dbg.fillRect(0, 0, WIDTH, HEIGHT);
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
g.drawImage(dbImage, 0, 0, null);
}
public void gameUpdate()
{
}
private void paintScreen()
{
Graphics g;
try
{
g = this.getGraphics();
if (g!= null && dbImage!= null)
g.drawImage(dbImage, 0, 0, null);
Toolkit.getDefaultToolkit().sync();
g.dispose();
}
catch (Exception e)
{
System.out.println("Error: " + e.getMessage());
}
}
public void terminate()
{
addKeyListener (new KeyAdapter()
{
public void keyPressed(KeyEvent e)
{
int keyCode = e.getKeyCode();
if (keyCode == KeyEvent.VK_ESCAPE)
{
stopGame();
}
}
});
}
}
import javax.swing.JFrame;
public class GameFrame extends JFrame
{
private final int WIDTH = 160;
private final int HEIGHT = WIDTH/12*9;
private final int RATIO = 3;
public GameFrame()
{
setTitle("User Input Game");
setSize(WIDTH*3,HEIGHT*3);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setResizable(false);
GamePanel mainPanel = new GamePanel();
add(mainPanel);
}
}
public class Main
{
public static void main(String[] args)
{
new GameFrame().setVisible(true);
}
}
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.Graphics;
导入java.awt.Image;
导入java.awt.Toolkit;
导入java.awt.event.KeyAdapter;
导入java.awt.event.KeyEvent;
导入javax.swing.JPanel;
公共类GamePanel扩展JPanel实现可运行
{
私有最终整数宽度=160;
专用最终内部高度=宽度/12*9;
私人最终int比率=3;
私有线程动画师;
私有化;布尔运行;
私人易变布尔博弈;
私人双FPS=60D;
私人双周期=1000/FPS;
私有镜像dbImage;
专用图形数据库;
公共游戏小组()
{
setPreferredSize(新尺寸(宽*3,高*3));
挫折地面(颜色:白色);
设置聚焦(真);
requestFocus();
终止();
}
public void addNotify()
{
super.addNotify();
startGame();
}
公共无效StartName()
{
System.out.println(“线程启动”);
animator=新线程();
animator.start();
}
公共游戏
{
System.out.println(“线程停止”);
运行=错误;
}
公开募捐
{
很久以前,时间差,睡眠时间;
beforeTime=System.currentTimeMillis();
系统输出打印项次(时间之前);
运行=真;
(跑步时)
{
System.out.println(“运行”);
gameUpdate();
gameRender();
漆幕();
timeDiff=System.currentTimeMillis()-beforeTime;
睡眠时间=(长)周期-时间差;
如果(sleepTime您需要更改startGame()方法:
您需要传递一个Runnable(其中GamePanel是其中之一)进入线程构造函数。线程在启动时运行runnable。您似乎在任何地方都没有main方法。无论是在此类中还是在外部类中,您都需要一个main方法来创建GamePanel实例并将其作为参数传递给线程类。如下所示:
public class Test
{
public static void main(String[] args)
{
Thread t = new Thread(new GamePanel()).start();
}
}
为什么你认为这个方法应该被谁调用?我忘了在帖子中包含这个方法。我刚刚添加了我的JFrame类和main方法。好的,现在在你的GameFrame类中,你需要在上面的代码行:add(mainPanel)之后添加代码。这将启动你的线程。
public class Test
{
public static void main(String[] args)
{
Thread t = new Thread(new GamePanel()).start();
}
}