Java 按钮b2=停止未在侦听

Java 按钮b2=停止未在侦听,java,multithreading,swing,Java,Multithreading,Swing,我在stopclock应用程序中添加了两个按钮;一个用于启动,另一个用于停止。开始起作用,但停止不起作用。我用了一根线 代码也创建了两个帧,如何避免呢 我们有四个类:一个main类和两个用于实现两个按钮的actionListeners类,另一个用于实现线程 import java.awt.*; import java.awt.event.*; public class stopclock { Frame f; Panel p; Button b1,b2; Label l; stopclock(

我在
stopclock
应用程序中添加了两个按钮;一个用于启动,另一个用于停止。开始起作用,但停止不起作用。我用了一根线

代码也创建了两个帧,如何避免呢

我们有四个类:一个main类和两个用于实现两个按钮的
actionListener
s类,另一个用于实现线程

import java.awt.*;
import java.awt.event.*;
public class stopclock 
{
Frame f;
Panel p;
Button b1,b2;
Label l;
stopclock(boolean k)
{
    f=new Frame();
    p=new Panel();
    b1=new Button("Start");
    b2=new Button("Stop");
    l=new Label("00:00:00");
    p.add(l);
    p.add(b1);
    p.add(b2);
    f.add(p);
    f.setTitle("Stop Clock");
    f.setSize(300,300);
    f.setVisible(true);
    b1.addActionListener(new one());
    b2.addActionListener(new two());
}
public static void main(String[] args) 
{
    stopclock s=new stopclock(false);
}
}
class one  implements ActionListener
{

//Thread th=new Thread();


public void actionPerformed(ActionEvent ae)
{
    new th().start();

}
}

class two implements ActionListener
{
public void actionPerformed(ActionEvent ae)
{

    th run=new th();
    Thread anb=new Thread(run);
    anb.suspend();
}

}
class th extends Thread
{
    int sec=0;
    int hr=0;
    int min=0;
    public void run()
    {
        stopclock st=new stopclock(true);
        //System.out.println("Hello");

        //st.f.setVisible(true);
        Label l2=st.l;
        try
        {

            while(true)
            {
                if(sec>59)
                {
                    min++;
                    sec=0;
                }
                if(min>59)
                {
                    hr++;
                    min=0;
                }
                if(hr>12)
                {
                    hr=0;
                }
                sec++;
                String str=hr+":"+min+":"+sec;
                l2.setText(str);



                th.sleep(1000);
            }
        }
        catch (Exception e)
        {
            System.out.println(e);
        }
    }
}

我将您的组件更改为Swing组件。您将获得2个帧,因为在线程中,您正在创建一个新的帧,其中包含
stopclock st=new stopclock(true)
。此外,使用
Thread
进行此操作会有很多问题。我使用了一个Swing
计时器

import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Timer;

public class StopClock {

    JLabel label = new JLabel("00:00:00");;
    Timer timer = new Timer(1000, new TimerListener());

    StopClock() {

        JButton startButton = new JButton("Start");
        JButton stopButton = new JButton("Stop");
        startButton.addActionListener(new StartActionListener());
        stopButton.addActionListener(new StopActionListener());

        JPanel panel = new JPanel();
        panel.add(label);
        panel.add(startButton);
        panel.add(stopButton);

        JFrame frame = new JFrame();
        frame.add(panel);
        frame.setTitle("Stop Clock");
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {

        EventQueue.invokeLater(() -> new StopClock());
    }

    class StartActionListener implements ActionListener {

        public void actionPerformed(ActionEvent ae) {

            timer.start();
        }
    }

    class StopActionListener implements ActionListener {

        public void actionPerformed(ActionEvent ae) {

            timer.stop();
        }
    }

    class TimerListener implements ActionListener {

        int sec = 0;
        int hr = 0;
        int min = 0;

        @Override
        public void actionPerformed(ActionEvent e) {

            if (sec > 59) {
                min++;
                sec = 0;
            }
            if (min > 59) {
                hr++;
                min = 0;
            }
            if (hr > 12) {
                hr = 0;
            }
            sec++;
            String str = hr + ":" + min + ":" + sec;
            label.setText(str);
        }
    }
}
有些东西是可以改进的,但我尽量让它接近你写的东西

注意事项:

  • 类名应以大写字母开头
  • 为变量指定有意义的名称
  • 从构造函数中删除了
    boolean
    参数
  • 使用
    pack()
    而不是
    setSize(…)
  • 最好调用
    setVisible(…)
    ,这是您做的最后一件事
  • 当局部变量可用时,不要使用字段(例如按钮)

好的。那么,您想停止启动的线程。是的,“anb”和th表示相同吗thread@VamshiRakela:嗯,不,他们没有。您正在创建一个全新的线程并停止新线程。没有地方可以停止原始线程。如何停止类中的第一个线程two@VamshiRakela:您需要在某个地方维护对变量中第一个线程的引用,并对该变量调用
suspend()
。我真的不确定在这个设置中有哪些设计选项可用,也许某个地方的
静态
变量可能会起作用。