gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 06:49:07 25 4
gpt4 key购买 nike

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

我正在处理三个类(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/

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