我曾尝试在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);
}
}
拜托,任何人都可以帮助我。
答案 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)循环线程化为一个新线程,以便摆动线程可以绘制并显示该帧。