【问题标题】:Moving JLabel in Java在 Java 中移动 JLabel
【发布时间】:2014-03-25 15:54:03
【问题描述】:

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


                }


}

拜托,谁能帮帮我。

【问题讨论】:

  • 你得到的输出是什么?
  • 程序不会执行任何操作

标签: java swing jlabel


【解决方案1】:

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

我希望这会有所帮助:)

【讨论】:

  • 谢谢,在另一个线程中启动该循环解决了这个问题
  • 会的。但是您必须将您的 JLabel 实例传递到该新线程中,并在每次更改边界时调用 revalidate()repaint()。我将添加一个您可以使用的可运行示例。
  • 谢谢,请添加示例
  • 谢谢你真棒!
  • when i remove repaint and revalidate it works fine - 默认情况下,JPanel 使用 FlowLayout。当您调用 revalidate() 时,会调用布局管理器,并且标签位于面板的开头。在做动画时,您应该使用“空布局”,然后您的程序负责设置组件的大小/位置。此外,您应该使用 Swing Timer 来制作动画。
【解决方案2】:

您需要将 while(true) 循环线程化到一个新线程中,以便 swing 线程可以绘制和显示帧。

【讨论】:

    猜你喜欢
    • 2014-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多