【问题标题】:how to move jlabel every second?如何每秒移动jlabel?
【发布时间】:2012-11-05 04:59:01
【问题描述】:

我尝试每秒钟将它向右移动一次(x++)

我尝试用线程移动它..

  1. 怎么办? (并且可以看到它每秒都在移动)
  2. 还有其他不使用线程的方法吗?
  3. 我应该使用什么布局管理器?

我试试..

public class help {
    JFrame frame = new JFrame();
    JLabel label = new JLabel("target");

    public help() {
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.setSize(800,600);
        frame.setLayout(new GridLayout());
        frame.add(label);
        label.setPreferredSize(new Dimension(100,100));
        label.setLocation(400, 300);

        frame.getContentPane().validate();
        frame.repaint();
        frame.setVisible(true);

        mysterious();
    }

    void mysterious(){
     ////////////////////////////////
     // part of edit responding David kroukamp  
    Thread t = new Thread(new Runnable() {
    @Override
    public void run() {
         try{

            for (int z=0; z<10; z++){
            label.setLocation((label.getLocationOnScreen().x+10), label.getLocationOnScreen().y);
            Thread.sleep(1000);  
            } 
        }catch(Exception ae){

    }
    }
});
t.start();
    //////////////////////////////



    }
    public static void main(String[]args){
        new help();  
        }
}

非常感谢您的任何帮助

【问题讨论】:

    标签: java multithreading swing jlabel


    【解决方案1】:
    • 类名以大写字母开头,即Help
    • 应在Event Dispatch Thread 上创建和修改 Swing 组件
    • 一个新的Thread 是这样创建的:

      Thread t = new Thread(new Runnable() {
          @Override
          public void run() {
              //work here
          }
      });
      t.start();//start thread
      

    但是我建议使用 Swing Timer,因为它在 EDT 上运行:

    编辑:

    根据您的问题,我建议使用Timer 创建线程点用于一般知识。

    问题是线程未在您的 swing GUI 的 EDT 线程上运行,就像 Timer 一样:

     int delay = 1000; //milliseconds
      ActionListener taskPerformer = new ActionListener() {
          int count=0;
          public void actionPerformed(ActionEvent evt) {
               if(count==10) {//we did the task 10 times
                     ((Timer)evt.getSource()).stop();
                }
    
                label.setLocation((label.getLocationOnScreen().x+10), label.getLocationOnScreen().y);
                System.out.println(SwingUtilities.isEventDispatchThread());
               count++;
          }
      };
      new Timer(delay, taskPerformer).start();
    

    参考:

    【讨论】:

    • ^^ 非常感谢.. 它工作.. 但是有一些东西,你能告诉我为什么 jlabel 的位置 y 会改变吗? (我编辑我的代码)..也许有关于问题 3 的建议?谢谢你的计时器
    • 我们很抱歉.. 它的改变是因为 getLocationOnScreen() {我不知道为什么} 但如果我用 getLocation() 改变它,它会返回正常
    • 谢谢..我喜欢这部分.. system.out.println(SwingUtilities.isEventDispatchThread())..谢谢
    【解决方案2】:

    这是一个简单益智游戏的Swing 示例。

    Java Swing Shuffle Game

    当您按下Pause 按钮时,标题将变为动画,直到您释放暂停。同样,您可以将其用于JLabel。源代码也附上。

    希望对你有很大帮助。

    【讨论】:

    • @moprmopr:不要忽视对您认为有帮助的答案进行投票。
    【解决方案3】:

    如果你将构造函数的那部分放在一个线程中,那么你可以调用thread.sleep(1000);(1000 毫秒延迟 1 秒)然后刷新,这应该会在屏幕上移动目标。

    【讨论】:

    • 怎么样?抱歉,因为我无法得到它.. 你能告诉我代码吗?
    猜你喜欢
    • 2014-07-20
    • 1970-01-01
    • 2011-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-10
    • 1970-01-01
    相关资源
    最近更新 更多