所以我正在为一个班级的项目工作。我一直在努力解决这个问题。下面的代码是一个开始屏幕,当按下回车键时(当atTitle
变为假时)我希望它绘制下一个图像。问题是我无法想到它在下一个图像变为假时绘制的方法。我尝试过使用ifs和whiles。主要问题是你显然在if语句中添加了另一个public void paintComponent
。我无法将Graphics g
变量带到KeyPressed
方法。
我被卡住了。
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
AffineTransform at = new AffineTransform();
g2.setTransform(at);
if (atTitle == true) {
g.drawImage(titlescreen, 0, 0, this);
if (start_visible == true) {
g.drawImage(start_symbol, -70, 30, this);
jf.addKeyListener(this);
}
}
}
public void keyTyped(KeyEvent e) {}
public void keyReleased(KeyEvent e) {}
public void keyPressed(KeyEvent e) {
//int keyCode = e.getKeyCode();
if (atTitle == true) {
if (e.getKeyCode() == KeyEvent.VK_ENTER) {
atTitle = false;
System.out.println("It Works.");
}
}
}
答案 0 :(得分:0)
如果你使用JPanel,你应该:
panel.setFocusable(true);
panel.requestFocusInWindow();
您也可以在按键中调用panel.revalidate()和/或panel.repaint()。
也许试图完全远离JPanel和Swing(不适合游戏,但适用于表单),只需使用带有Window,Frame和Canvas的graphics2D功能,如之前的评论所示。
答案 1 :(得分:0)
您需要致电repaint
并等待系统调用paint
功能。你不应该保留graphic
对象并在函数中使用它不是paint
的子函数
作为一个简单的画布组件,你可以使用这个
class Game extends Canvas implements Runnable {
private Thread thread;
public Game(){
thread = new Thread(this);
thread.start();
}
@Override
public void paint(Graphics g) {
// paint your game
}
public void stop(){
thread = null;
}
@Override
public void run() {
while (thread == Thread.currentThread()){
long ti = System.currentTimeMillis();
repaint();
long ti2 = System.currentTimeMillis();
long waitTime = 60 - (ti2-ti);
if (waitTime > 0){
try {
Thread.sleep(waitTime);
} catch (Exception e){
}
}
}
}
}