JLabel 不动

问题描述 投票:0回答:3

我想移动一张小图片。它是 JLabel 中的 ImageIcon。我的计划是按下一个 JButton,执行一个 while 循环,每秒将其向右移动 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){}
                              }

}

现在我的问题是图片不动。坐标已更改,但未重新定位。

java swing
3个回答
1
投票

您必须重新绘制框架才能查看更改,因此调用

repaint()
JFrame
方法来更新 ui。

例如,

if(e.getSource() == jbUUp){
    User.moveUp();
    repaint();
}

希望能成功。


1
投票

JLabel 正在移动。屏幕未重新绘制,因此无法显示 JLabel 的新位置。在游戏文件中的某个地方,您需要调用

repaint();
来重新绘制屏幕;


1
投票

首先:

  1. 当您提出问题时,发布格式正确的代码。你的代码的缩进到处都是。如果您希望我们花时间阅读您的代码,请确保代码可读。

  2. 摆脱所有静态变量。 static 关键字不应该这样使用。

  3. 遵循 Java 命名约定。变量名称不应以大写字符开头。

我的计划是按下 JButton 执行 while 循环,每秒将其向右移动 50px

不能使用 while 循环。循环内的 Thread.sleep() 将阻止 GUI 重新绘制自身,直到循环完成执行,在这种情况下,您只会看到最终位置的图标。

解决方案是使用

Swing Timer
。计时器将生成一个事件,此时您可以计算新位置。当您希望动画完成时,您需要停止计时器。

阅读 Swing 教程中关于如何使用 Swing 计时器的部分以获取更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.