关于JAVA GUI线程编程运行时的一个小问题

在练习学校编程实验题遇到的小问题,代码如下:

要求【点击“向右走”按钮,标签“向右移标签”会向向右移动10次,每次移动10个单位。同理“向左走”按钮。】

我按照以下运行,却出现窗体无限生成的情况。
图片说明
定位确认是因为创建线程那几句导致的,删除就能正常显示窗体了。我想求教以下,我应该如何创建线程才不会出现这个问题呢(尽量利用Runnable接口实现)? 0.0

 public class JButton_Move{
    JFrame jf=new JFrame();
    JLabel jl1=new JLabel("向右移标签");
    JLabel jl2=new JLabel("向左移标签");
    JButton jb1=new JButton("向右走");
    JButton jb2=new JButton("向左走");
        int jl1_X=10;
    int jl2_X=200;
    public void init(){
        jf.setSize(300,150);
        jf.setLayout(null);
        jf.add(jb1);
        jf.add(jb2);
        jf.add(jl1);
        jf.add(jl2);
        jb1.setBounds(50,100,80,20);
        jb2.setBounds(150,100,80,20);
        jl1.setBounds(jl1_X,30,80,20);
        jl2.setBounds(jl2_X,60,80,20);
        jf.setVisible(true);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    JButton_Move(){
        init();
        Thread t1=new Thread(new move());
        t1.start();
    }
    public static void main(String[] args){
        JButton_Move jm=new JButton_Move();
    }
}
class move extends JButton_Move implements Runnable{
    public void run(){
        jb1.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                for(int i=0;i<10;i++){
                    try{
                        Thread.sleep(1000);
                        jl1.setLocation(jl1_X+10,30);
                    }catch (InterruptedException a){
                        System.out.println("error..");
                    }
                }
            }
        });
        jb2.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                for(int i=0;i<10;i++){
                    jl2.setLocation(jl2_X-10,60);
                }
            }
        });
    }
}

1个回答

......
趁没人回答之前,赶紧自我终结这个智障提问。
之所以会无限创建框体是因为我下面的move类继承了我的主类。于是就无限创建线程生成窗体..
修改后代码如下:

 import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class JButton_Move extends Thread{
    JFrame jf=new JFrame();
    JLabel jl1=new JLabel("向右移标签");
    JLabel jl2=new JLabel("向左移标签");
    JButton jb1=new JButton("向右走");
    JButton jb2=new JButton("向左走");
    int jl1_X=10;
    int jl2_X=200;
    Boolean bool;
    public void init(){
        jf.setSize(300,150);
        jf.setLayout(null);
        jf.add(jb1);
        jf.add(jb2);
        jf.add(jl1);
        jf.add(jl2);
        jb1.setBounds(50,100,80,20);
        jb2.setBounds(150,100,80,20);
        jl1.setBounds(jl1_X,30,80,20);
        jl2.setBounds(jl2_X,60,80,20);
        jf.setVisible(true);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jb1.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                bool=true;
                Thread t1=new Thread(new move());
                t1.start();
            }
        });
        jb2.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                bool=false;
                Thread t2=new Thread(new move());
                t2.start();
            }
        });
    }
    public class move implements Runnable{
        public void run(){
            if(bool){
                try{
                    for(int i=0;i<10;i++){
                        Thread.sleep(1000);
                        jl1.setLocation(jl1_X,30);
                        jl1_X+=10;
                    }
                }catch(Exception err){
                    System.out.println("JL1异常!");
                }
            }
            else{
                try{
                    for(int i=0;i<10;i++){
                        Thread.sleep(1000);
                        jl2.setLocation(jl2_X,60);
                        jl2_X-=10;
                    }
                }catch(Exception err){
                    System.out.println("JL2异常!");
                }
            }
        }
    }
    JButton_Move(){
        init();
    }
    public static void main(String[] args){
        JButton_Move jm=new JButton_Move();
    }
}
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!