我目前正在尝试制作我的第一个游戏,但我无法使用repaint()方法。我检查了我的keyListeners,并确认他们正常工作!我创建的船只移动,但只有当我通过拖动侧面强行调整窗口大小。如果有人有任何提示,我会非常感激!
如果您需要更多信息,请随时提出!
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
public class Main extends Canvas implements KeyListener{
public static Ship playerShip = new Ship(150,450,"F5S4-Recovered.png");
public int numberOfEnemies = 0;
public static void createFrame(){
Window frame1 = new Window();
final JPanel pane = new JPanel(){
public void paintComponent(Graphics g){
super.paintComponent(g);
g.setColor(Color.BLACK);
g.fillRect(0, 0, 1000, 1000);
g.drawImage(playerShip.image, playerShip.xPos1, playerShip.yPos1, this);
}
};
frame1.add(pane);
}
public void keyTyped(KeyEvent e){System.out.println("KeyTyped");}
public void keyPressed(KeyEvent e){
switch(e.getKeyCode())
{
case KeyEvent.VK_LEFT :
playerShip.xPos1-=2;
break;
case KeyEvent.VK_RIGHT:
playerShip.xPos1+=2;
break;
}
repaint();
}
public void keyReleased(KeyEvent e){}
public static void main(String args[]){
createFrame();
}
}
Window class --------------------------------------------- -------------
import javax.swing.*;
public class Window extends JFrame{
public Window()
{
setTitle("Space Game");
setSize(800,800);
setDefaultCloseOperation(EXIT_ON_CLOSE);
addKeyListener(new Main());
setVisible(true);
}
}
答案 0 :(得分:1)
您对repaint()
的来电正在重新绘制课程Canvas
,但这幅画是在JPanel pane
上完成的。调整大小会自动重新绘制面板。所以要修复你想要pane.repaint()
,但除非你把面板作为类成员,否则你不能这样做,所以你可以从监听器方法访问它。现在,它目前在createFrame()
方法的本地范围内。
另外,您应该将监听器添加到面板中,甚至不扩展Canvas
,因为您甚至不使用它
其他注释:
使用Key Bindings代替低级KeyListener
Swing应用程序应该从Event Dispatch Thread(EDT)运行。您只需将main
中的代码包装在SwingUtilities.invokeLate(..)
中即可。详情请见Initial Threads
同样,我只想补充一点,不要延伸Canvas