如何实现 JFrame 按钮来启动计时器?

How do I implement a JFrame button to begin a timer?

提问人:CiY3 提问时间:9/13/2021 最后编辑:Andrew ThompsonCiY3 更新时间:10/7/2021 访问量:62

问:

我有一个简单的程序,它只是告诉你程序开始运行多久了。这是代码(就像预期的那样工作!

import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.Color;
import java.awt.FlowLayout;
import javax.swing.*;



@SuppressWarnings("serial")
public class Program extends JFrame {
    JFrame frame;
    JButton button;

    public Program() {
         
        frame.setLayout(new FlowLayout());
        frame.add(button);
        frame.setVisible(true);
        
        button = new JButton("Click Me!");
        button.addActionListener((ActionListener) this);
        
        setTitle("Hello");
        setSize(1200,800);
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    public void frame(Graphics g) throws InterruptedException{
        int decaseconds = 0;        
        int seconds = 0;
        int minutes = 0;
        int hours = 0;
        
        for(int i = 0; i < 2; i++) {
            i--;
            decaseconds += 1;
            if(decaseconds == 100) {
                decaseconds -= 100;
                seconds++;
            }
            if(seconds == 60) {
                seconds -= 60;
                minutes++;
            }
            if(minutes == 60) {
                minutes -= 60;
                hours++;
            }
            
            System.out.println(hours + " hours : " + minutes + " minutes : " + seconds + " seconds : " + decaseconds + " decaseconds ");
            
            g.setColor(Color.white);
            g.fillRect(0, 0, 1200, 800);
            g.setColor(Color.blue);
            g.drawString(hours + " hours : " + minutes + " minutes : " + seconds + " seconds : " + decaseconds + " decaseconds", 100, 100);
            Thread.sleep(10);
        }
    }
    
    public void actionPerformed(ActionEvent e) {
        System.out.println("You have clicked the button");
    }
    
    public static void main(String[] args) throws InterruptedException {
        Program p  = new Program();
        for(int i = 0; i < 1000; i++) {
            p.frame(p.getGraphics());
            Thread.sleep(1);
        }
    }
}

我想在程序中放一个按钮,您可以在其中单击按钮以启动计时器。所以我读了一个教程,发现这个:

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

class ActionEventDemo implements ActionListener {
    JFrame frame=new JFrame();
    JButton button=new JButton("Click Me");

    ActionEventDemo(){
        prepareGUI();
        buttonProperties();
    }

    public void prepareGUI(){
        frame.setTitle("My Window");
        frame.getContentPane().setLayout(null);
        frame.setVisible(true);
        frame.setBounds(200,200,400,400);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    public void buttonProperties(){
        button.setBounds(130,200,100,40);
        frame.add(button);
        button.addActionListener(this);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        //Changing Background Color
        frame.getContentPane().setBackground(Color.pink);

    }
}

public class MainClass {
    public static void main(String[] args)
    {
        new ActionEventDemo();
    }
}

我试图将两者合并,但我不知道为什么。有人可以告诉我我应该怎么做吗?提醒:我希望程序在我按下按钮后开始计数(如第一个示例)。

谢谢!

Java Swing 事件 jframe jbutton

评论

0赞 maloomeister 9/13/2021
简单地尝试复制、粘贴和合并其他人的代码是一回事。但了解代码的作用和原因更为重要。您应该了解基础知识。例如,请查看如何使用摆动计时器
0赞 maloomeister 9/13/2021
这是摆动秒表的可运行示例。这基本上就是你想要的。
0赞 CiY3 9/13/2021
哦,不,我确实理解它们,但我无法弄清楚我收到的错误消息。
0赞 maloomeister 9/13/2021
然后,您应该发布有关您收到的错误消息的具体问题。目前,您的“问题”是:“我试图将两者合并,但我不知道为什么。有人可以告诉我我应该怎么做吗?"

答:

0赞 RAVN Mateus 9/13/2021 #1

创建一个变量并使用其默认构造函数对其进行初始化。然后将 actionPerformed 代码更改为java.util.Timer timer

@Override
public void actionPerformed(ActionEvent e) {
    timer.scheduleAtFixedRate(new TimerTask() {
        @Override
        public void run() {
            // Something, that should be executed every interval
        }
    }, 0, intervalInMilliseconds);
}

不过,您可能希望添加取消计时器 () 的可能性。timer.cancel()