当前位置: 首页 > 知识库问答 >
问题:

在Java移动JLabel

易自珍
2023-03-14

我试着用Java写一个包含图像的标签每秒钟都在移动的程序,但不幸的是代码没有运行,尽管它包含零错误。有没有人知道发生了什么。代码如下:

import javax.swing.*;
import java.util.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;

public class what extends JFrame {
         private JPanel  panel;
         private Random r= new Random();
         private JLabel image;
         private Random s = new Random();


         public what (){
             super("Catch him!");
             panel = new JPanel();
             Icon b = new ImageIcon(getClass().getResource("img.JPG"));
             image = new JLabel(b);
             panel.add(image);
             add(panel,BorderLayout.CENTER);
             panel.setBackground(Color.yellow);

             panel.add(image);
        while(true){
                int x = s.nextInt(1000);
                 int y = s.nextInt(900);

                  try{
                      Thread.sleep(1000);
                  }catch(Exception e){

             }

                 image.setBounds(x, y,200, 200);
          }




}
        public static void main(String[] args){
            what c = new what();
            c.setVisible(true);
            c.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE );
            c.setSize(1920,1080);


                }


}

拜托,有谁能帮我。

共有1个答案

甄成弘
2023-03-14

您正在单线程中执行无限循环。创建new what();时,循环将开始,并且永不结束。因此,永远无法访问c.setVisible(true);

您需要为要运行的循环创建一个单独的线程。您可以创建以下类;

public class Infout implements Runnable{

    private JFrame frame;
    private JLabel image;
    private Random s = new Random();

    public Infout(JFrame frame, JLabel image){
        this.frame = frame;
        this.image = image;
    }

    @Override
    public void run() {
        while(true){
           int x = s.nextInt(1000);
           int y = s.nextInt(900);

           try{ Thread.sleep(1000); }
           catch(InterruptedException e){ }
           image.setBounds(x, y, 200, 200);
        }
    }
}

然后实例化并在您的main方法中运行,如下所示;

Infout inf = new Infout(c, image);
new Thread(inf).start();

我希望这会有所帮助:)

 类似资料:
  • 问题内容: 我想制作一个可以测量光标到组件中心的距离,然后将光标移回中心的应用程序(就像大多数PC视频游戏一样)。有没有人有什么建议? 问题答案: 机器人课可以帮您解决问题。以下是用于移动鼠标光标的示例代码:

  • 问题内容: 我希望简单的动画每0.5秒设置一次位置,但它不会仅在循环结束时设置动画。 int x = 1; int y = 1; 我已经尝试过使用thread.sleep()绘制动画,并且可以正常工作,但动画确实正确,但不幸的是,这对我来说不是一个选择,因为我需要在框架内移动jlabel并在其中放置图形图片。有人可以帮助我解决这个问题。 我已经尝试过这两个相同的结果 问题答案: 与其使用Java

  • 问题内容: 我做了一个绘制椭圆并相互链接的迷你代码,现在我尝试移动椭圆(圆),但是我在编码时遇到了问题 移动两个圆圈,并且直线一定不能移动(Graph节点),请帮帮我,谢谢:)更新后(感谢MadProgrammer),现在我可以移动所有 图形了 问题答案: 基本上,因为可以使用而不是使用 这将确保整个组件被重新粉刷。 虽然我不反对使用repaint(int, int),因为您的绘画过程相对简单,但

  • 4/26约的下午三点半面试,等了差不多十五分钟左右吧 面试官人挺好的,中间由于紧张说的十分混乱还说没关系,问题也没有特别难的都是常见八股 1、final的用法,能不能修饰抽象类呢 2、array list和linklist区别 3、引用类型和值类型的区别 4、如何确保array list的线程安全(这个我不会,说了自己加锁来确保线程安全。) 5、并发和并行区别 6、MySQL建立索引需要考虑那些地

  • 问题内容: 更新到OS X 10.11后,我的Java停止工作。我读了多个应该做的地方: 但是问题是当我运行第一行代码时,我得到的是: 有什么想法可以解决吗? 问题答案: 好像新的OS X引入了新的系统集成保护(又名无根)一样。 您可以尝试通过以下步骤在恢复模式下禁用无根用户: 进入恢复模式(听到启动音后同时重新启动并按住+ 键) 当出现“ OS X Utilities”屏幕时,请下拉屏幕顶部的“

  • 但问题是,当我运行第一行代码时,我得到的只是: 你知道我能做些什么来解决这个问题吗?