在Java中移动JLabel

时间:2014-03-25 15:54:03

标签: java swing jlabel

我曾尝试在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);


                }


}

拜托,任何人都可以帮助我。

2 个答案:

答案 0 :(得分:5)

您正在单个线程中执行无限循环。创建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();

我希望这会有所帮助:)

答案 1 :(得分:1)

您需要将while(true)循环线程化为一个新线程,以便摆动线程可以绘制并显示该帧。