我想要移动一张小图片。它是JLabel中的ImageIcon。我的计划是按下一个执行while循环的JButton,它每秒向右移动50px。
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Game extends JFrame implements ActionListener{
JButton jbUUp;
JButton jbUDw;
JButton jbUSh;
public static ImageIcon shot;
public static ImageIcon spL;
public static ImageIcon spR;
public static JLabel LspL;
public static JLabel LspR;
public static JLabel Lshot;
public static int shPosUser = 150;
public static int shPosKI = 150;
public static int shXPosUser = 180;
Game(){setLayout(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(1000, 500);
getContentPane().setBackground(Color.WHITE);
spR = new ImageIcon("src/spR.jpg");
LspR = new JLabel(spR);
LspR.setSize(170, 170);
LspR.setLocation(820, shPosKI);
LspR.setVisible(true);
spL = new ImageIcon("src/spL.jpg");
LspL = new JLabel(spL);
LspL.setSize(170, 170);
LspL.setLocation(10, shPosUser);
LspL.setVisible(true);
shot = new ImageIcon("src/shot.gif");
Lshot = new JLabel(shot);
Lshot.setSize(21, 15);
Lshot.setLocation(shXPosUser, shPosUser + 77);
Lshot.setVisible(false);
jbUUp = new JButton("U");
jbUUp.setSize(60, 30);
jbUUp.setLocation(10, 350);
jbUUp.addActionListener(this);
jbUDw = new JButton("D");
jbUDw.setSize(60, 30);
jbUDw.setLocation(10, 420);
jbUDw.addActionListener(this);
jbUSh = new JButton("S");
jbUSh.setSize(60, 30);
jbUSh.setLocation(10, 385);
jbUSh.addActionListener(this);
add(LspR);
add(LspL);
add(Lshot);
add(jbUUp);
add(jbUDw);
add(jbUSh);
}
public void actionPerformed(ActionEvent e){if(e.getSource() == jbUUp){User.moveUp();}
if(e.getSource() == jbUDw){User.moveDown();}
if(e.getSource() == jbUSh){User.shot();}
}
}
这是两个类
public class User {
User(){}
public static void moveUp(){Game.shPosUser = Game.shPosUser - 10;
Game.LspL.setLocation(10, Game.shPosUser);}
public static void moveDown(){Game.shPosUser = Game.shPosUser + 10;
Game.LspL.setLocation(10, Game.shPosUser);}
public static void shot(){Game.Lshot.setVisible(true);
while(Game.shXPosUser < 500){timeout(1000);
Game.shXPosUser = Game.shXPosUser + 50;
System.out.println(Game.shXPosUser);
Game.Lshot.setLocation(Game.shXPosUser, Game.shPosUser);
}
Game.Lshot.setVisible(false);
Game.shXPosUser = 180;
Game.Lshot.setLocation(Game.shXPosUser, Game.shPosUser );
}
public static void timeout(int time){try{Thread.sleep(time);}
catch(Exception e){}
}
}
现在我的问题是图片无法移动。坐标已更改,但未重新定位。
答案 0 :(得分:1)
您必须重新绘制框架以查看更改,因此请调用repaint()
JFrame
方法来更新ui。
例如,
if(e.getSource() == jbUUp){
User.moveUp();
repaint();
}
希望它能够发挥作用。
答案 1 :(得分:1)
JLabel 正在移动。屏幕没有重新绘制,因此无法显示JLabel的新位置。在游戏文件的某个位置,您需要调用repaint();
来重新绘制屏幕;
答案 2 :(得分:1)
首先:
在提出问题时发布格式正确的代码。代码的缩进遍布各处。如果您希望我们花时间阅读您的代码,请确保代码可读。
摆脱所有静态变量。这不是应该如何使用static关键字。
遵循Java命名约定。变量名称不应以大写字符开头。
我的计划是按下一个执行while循环的JButton,每秒向右移动50px
您无法使用while循环。循环内的Thread.sleep()将阻止GUI重新绘制,直到循环完成执行,在这种情况下,您只能看到最终位置的图标。
解决方案是使用Swing Timer
。计时器将生成一个事件,您可以在此时计算新位置。然后,您需要在想要完成动画时停止计时器。
阅读How to Use Swing Timers上的Swing教程中的部分以获取更多信息。