gpt4 book ai didi

java - 按钮 b2 =stop 未监听

转载 作者:行者123 更新时间:2023-11-30 07:43:10 24 4
gpt4 key购买 nike

我在stopclock应用程序中添加了两个按钮;一个用于开始,另一个用于停止。开始有效,但停止无效。我为此使用了一个线程。

代码还创建了两个框架,如何避免这种情况?

我们有四个类:一个主要类,两个用于实现两个按钮的 actionListener,另一个用于实现线程。

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 Timer 来代替:

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(...)
  • 当可以使用局部变量时,不要使用字段(例如按钮)。

关于java - 按钮 b2 =stop 未监听,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34370903/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com