问题描述
我正在尝试用老虎追逐百吉饼作为PacMan的替代品(不要问为什么)。我仍处于第一阶段,试图使老虎在JFrame周围移动。但是,既然我实现了KeyEvent,该图像将不再显示。我已经坚持了一个小时,但我不知道哪里出了问题。
编辑:我已经显示了图像,但是按箭头键时图像没有更新或更改位置,这可能与KeyEvent和PacMan类之间的连接有关。
主要:
public Main() {
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokelater(new Runnable() {
public void run() {
UI frame = null;
try {
frame = new UI();
} catch (IOException e) {
e.printstacktrace();
System.exit(-1);
}
}
});
}
UI:
public PacMan PacMan;
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keypressed(KeyEvent e) {
}
@Override
public void keyreleased(KeyEvent e) {
int key = e.getKeyCode();
if (key == KeyEvent.VK_RIGHT){
PacMan.moveRight();
}
if (key == KeyEvent.VK_LEFT){
PacMan.moveLeft();
}
if (key == KeyEvent.VK_UP){
PacMan.moveUp();
}
if (key == KeyEvent.VK_DOWN){
PacMan.moveDown();
}
}
public UI() throws IOException {
this.PacMan = new PacMan();
addKeyListener(this);
setFocusable(true);
setFocusTraversalKeysEnabled(false);
JFrame frame = new JFrame();
JPanel panel = new JPanel();
frame.setTitle("PacMan");
frame.setResizable(false);
frame.setSize(1200,700);
frame.setMinimumSize(new Dimension(1200,700));
frame.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
panel.setBackground(Color.BLACK);
panel.add(PacMan.getimage());
frame.add(panel);
frame.setVisible(true);
}
吃豆人:
public int xCoords = 570;
public int yCoords = 320;
JLabel pacManImage = new JLabel();
Icon tigerLeft;
Icon tigerRight;
public PacMan() throws IOException {
ImageIcon tigerLeft = new ImageIcon(new ImageIcon("textures/tigerLeft.png").getimage().getScaledInstance(60,40,Image.SCALE_DEFAULT));
ImageIcon tigerRight = new ImageIcon(new ImageIcon("textures/tigerRight.png").getimage().getScaledInstance(60,Image.SCALE_DEFAULT));
pacManImage.setIcon(tigerRight);
pacManImage.setVisible(true);
}
public void initialDraw() {
pacManImage.setBounds(xCoords,yCoords,60,40);
pacManImage.setIcon(tigerRight);
pacManImage.repaint();
}
public void moveRight() {
System.out.println("here: " + tigerRight);
//xCoords = xCoords + 2;
pacManImage.setIcon(tigerRight);
pacManImage.setLocation(pacManImage.getLocationOnScreen().x + 2,pacManImage.getLocationOnScreen().y);
pacManImage.repaint();
}
public void moveLeft() {
//xCoords = xCoords + 2;
pacManImage.setIcon(tigerLeft);
pacManImage.setLocation(pacManImage.getLocationOnScreen().x - 2,pacManImage.getLocationOnScreen().y);
pacManImage.repaint();
}
public void moveUp() {
//yCoords = yCoords + 2;
pacManImage.setLocation(pacManImage.getLocationOnScreen().x,pacManImage.getLocationOnScreen().y - 2);
pacManImage.repaint();
}
public void moveDown() {
//yCoords = yCoords + 2;
pacManImage.setLocation(pacManImage.getLocationOnScreen().x,pacManImage.getLocationOnScreen().y + 2);
pacManImage.repaint();
}
public JLabel getimage(){
return pacManImage;
}
解决方法
您的UI类尚未完成,所以我无法确切知道您在做什么。我只能猜测。
忽略实际的KeyListener代码,我猜您是这样的代码:
public class UI extends JPanel
{
public UI() throws IOException
{
this.PacMan = new PacMan();
addKeyListener(this);
JFrame frame = new JFrame();
JPanel panel = new JPanel();
panel.setBackground(Color.BLACK);
panel.add(PacMan.getImage());
frame.add(panel);
frame.setVisible(true);
}
}
因此,您再次拥有两个JPanel组件:
- UI类“是” JPanel,然后将KeyListener添加到其中。
- 然后创建第二个JPanel并将“ PacMan”添加到该面板,然后将该面板添加到框架。
所以问题在于第一个面板具有KeyListener,但它从未添加到框架中。
您的课程应该像这样:
public class UI extends JPanel
{
public UI() throws IOException
{
this.PacMan = new PacMan();
addKeyListener(this);
setBackground(Color.BLACK);
add(PacMan.getImage());
}
}
就是这样。框架的创建不属于此类。
,我发现我的keyReleased函数从未被调用过,我通过发布最简单的修复程序,在UI方法中移动KeyListener来解决该问题。
UI类代码:
const fullURL = `instagram://library?AssetPath=${encodedURL}`;
Linking.openURL(fullURL).catch(() =>
alert('You should install instagram app first.'),);