kiokh 2017-11-19 05:12 采纳率: 0%
浏览 944

关于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条回答

  • kiokh 2017-11-19 08:11
    关注

    ......
    趁没人回答之前,赶紧自我终结这个智障提问。
    之所以会无限创建框体是因为我下面的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();
        }
    }
    
    评论

报告相同问题?

悬赏问题

  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?