java - 计时器在启动时创建一个新窗口

标签 java swing user-interface javax.swing.timer

当我点击开始按钮时,我的计时器正在创建一个带有不起作用按钮的新窗口。显示的更改仅发生在新窗口中,但启动/停止功能仅在旧窗口中起作用。我不确定这里发生了什么事。有人可以帮我弄清楚如何阻止它在按下开始时创建新窗口吗?

我正在处理三个类(class)。第一个运行计时器。

package timer;

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

public class TaskTimer extends TaskTimerWindow {

    int seconds = 0;
    int minutes = 0;
    int hours = 0;
    final int UNIT = 1000;
    boolean stopped = false;
    Timer timer;

    public TaskTimer() {

        ActionListener go = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                count();    
            }   
        };

        timer = new Timer(UNIT, go);
        timer.start();      
    }

    public void resume() {
        if(stopped) {
            seconds = 0;
            minutes = 0;
            hours = 0;
        }   
    }

    public void end() {
        timer.stop();   
    }

    public void count() {
        if(seconds < 59) {
            seconds++;
        } else if(minutes < 59) {
            seconds = 0;
            minutes++;
        } else {
            seconds = 0;
            minutes = 0;
            hours++;
        }
        changeDisplay(String.format("%02d", hours) + ":" 
             + String.format("%02d", minutes)  + ":" 
             + String.format("%02d", seconds));
    }
}

第二个创建并更新显示。

package timer;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;


public class TaskTimerWindow extends JFrame {

    JLabel timeDisplay;
    JButton start, stop, pause;

    public TaskTimerWindow() {

        JPanel timerWindow = new JPanel();
        JPanel buttonSpace = new JPanel();

        timeDisplay = new JLabel("00:00:00");
        timeDisplay.setHorizontalAlignment((int) CENTER_ALIGNMENT); 
        timeDisplay.setFont(new Font("Arial", Font.PLAIN, 48));

        timeDisplay.setBackground(Color.WHITE);

        timerWindow.add(timeDisplay);

        start = new JButton("Start");
        stop = new JButton("Stop");
        pause = new JButton("Pause");

        buttonSpace.add(start);
        buttonSpace.add(stop);
        buttonSpace.add(pause);

        getContentPane().add(timerWindow, BorderLayout.NORTH);
        getContentPane().add(buttonSpace);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
        setLocationRelativeTo(null);
        setTitle("Task Timer");
        pack();
    }

    public JLabel getText() {
        return timeDisplay;
    }

    public void changeDisplay(String time) {
        getText().setText(time);
    }

}

第三个是 Controller 。

package timer;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class ControlTimer {
    boolean stopped = false;
    boolean paused = false;
    TaskTimer timer;


    public ControlTimer() {
        TaskTimerWindow window = new TaskTimerWindow();
        window.start.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                timer = new TaskTimer();
            }
        });

        window.stop.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                stopped = true;
                timer.end();
            }
        });

        window.pause.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                paused = true;
            }
        });
    }
}

最佳答案

所以主要问题出在您的 ControlTimer 类中。由于 TaskTimer 扩展了 TaskTimerWindow,每次按下开始按钮时,它都会创建新窗口。您应该按如下方式修改它:

public class ControlTimer {
    boolean stopped = false;
    boolean paused = false;
    TaskTimer timer;


    public ControlTimer() {
        timer = new TaskTimer();
        timer.start.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                timer.resume();
                timer.start();
            }
        });

        timer.stop.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                timer.stopped = true;
                timer.end();
            }
        });

        timer.pause.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                timer.end();
            }
        });
    }
}

此外,TaskTimer 类也有一些细微的变化(从构造函数中删除 timer.start() 并引入单独的 start() 方法相反:

public TaskTimer() {

    ActionListener go = new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            count();
        }
    };

    timer = new Timer(UNIT, go);
}

public void start() {
    timer.start();
}

关于java - 计时器在启动时创建一个新窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43150987/

相关文章:

java - 错误 : Make sure the Cursor is initialized correctly before accessing data from it?

java - 如何将 Enter 指定为我的 Java 应用程序中所有 JButton 的触发键?

java - 矩阵方括号

java - Apache POI 在 xls 文档打开后设置选定的单元格

java - 服务定位器与依赖注入(inject)

java - 如何使用定时器动态调整帧大小?

java - 我正在尝试用 Java 制作一个带有 GUI 的计算器

ios - UIActivityViewController iPad 问题

java - 将 2 个 RxJava Observables 转换为 1 个 Map

Java定时器随机时间每次在2个值之间