Java 如何每秒移动jlabel?

Java 如何每秒移动jlabel?,java,multithreading,swing,jlabel,Java,Multithreading,Swing,Jlabel,我试着每秒钟将它移到右边的X++上 我试着用线移动它 怎么做?可以看到它每秒钟移动一次 有没有其他不用线程的方法? 我应该使用什么布局管理器? 我试试看 public class help { JFrame frame = new JFrame(); JLabel label = new JLabel("target"); public help() { frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_C

我试着每秒钟将它移到右边的X++上

我试着用线移动它

怎么做?可以看到它每秒钟移动一次 有没有其他不用线程的方法? 我应该使用什么布局管理器? 我试试看

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();  
        }
}

非常感谢您提供的任何帮助

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

如果将构造函数的该部分放入线程中,则可以调用thread.sleep1000;1000毫秒,延迟1秒,然后刷新,这将使目标在屏幕上移动

类名以大写字母开头,即帮助 应在上创建和修改Swing组件 将创建一个新线程,如下所示:

Thread t = new Thread(new Runnable() {
    @Override
    public void run() {
        //work here
    }
});
t.start();//start thread
但是,我建议在EDT上运行Swing计时器:

编辑:

根据您的问题,我建议使用计时器创建线程点是为了了解一般知识

问题是该线程没有在swing GUI的EDT线程上运行,而计时器会:

参考:

类名以大写字母开头,即帮助 应在上创建和修改Swing组件 将创建一个新线程,如下所示:

Thread t = new Thread(new Runnable() {
    @Override
    public void run() {
        //work here
    }
});
t.start();//start thread
但是,我建议在EDT上运行Swing计时器:

编辑:

根据您的问题,我建议使用计时器创建线程点是为了了解一般知识

问题是该线程没有在swing GUI的EDT线程上运行,而计时器会:

参考:

下面是一个简单益智游戏的Swing示例

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

希望这能对您有所帮助。

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

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


希望这能帮你很多忙。

怎么办?抱歉,我弄不懂。。你能告诉我密码吗?怎么说?抱歉,我弄不懂。。你能给我看看代码吗?^^非常感谢。。它起作用了。。但有件事,你能给我一个提示为什么jlabel的位置y会改变吗?我编辑我的代码。。也许对第三个问题有什么建议?谢谢你的时间。对不起。。它的更改是因为getLocationOnScreen{我不知道为什么}但是如果我用getLocation更改它,它的返回值将为normalthankz。。我喜欢这一部分。。system.out.printlnSwingUtilities.isEventDispatchThread。。谢谢,非常感谢。。它起作用了。。但有件事,你能给我一个提示为什么jlabel的位置y会改变吗?我编辑我的代码。。也许对第三个问题有什么建议?谢谢你的时间。对不起。。它的更改是因为getLocationOnScreen{我不知道为什么}但是如果我用getLocation更改它,它的返回值将为normalthankz。。我喜欢这一部分。。system.out.printlnSwingUtilities.isEventDispatchThread。。thankz@moprmopr:不要忽略向上投票你认为有用的答案。@moprmor:不要忽略向上投票你认为有用的答案。