我目前正在尝试制作我的第一个游戏,但在使 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();
}
}
窗口类-------------------------------------------------------- -------------
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);
}
}
最佳答案
对 repaint()
的调用正在重新绘制 Canvas
类,但绘制是在 JPanel Pane
上完成的。调整大小会导致面板自动重新绘制。因此,要解决此问题,您需要 pane.repaint()
,但除非您将面板作为类成员,否则您不能这样做,这样您就可以从监听器方法访问它。目前,它的作用域位于 createFrame()
方法的本地范围内。
此外,您可能应该将监听器添加到面板中,甚至不扩展 Canvas
,因为您甚至没有使用它
其他注意事项:
考虑使用 Key Bindings而不是低级的 KeyListener
Swing 应用程序应从事件调度线程 (EDT) 运行。您只需将
main
中的代码包装在SwingUtilities.invokeLate(..)
中即可实现此目的。查看更多Initial Threads再次,我只是添加,不要扩展
Canvas
关于java - 调整大小是重新绘制 JFrame 的唯一方法。重绘();似乎不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23531652/