Java 穿线秒表
我正在尝试创建4个秒表,它们都同时运行。他们都是在节目开始时开始的 我希望用户能够使用Q、W、E、R键加速秒表(按照键盘模式从左到右)。我已经建立了几乎所有的东西,但它不会让我按任何其他键,但R键加快第四个时钟 我想实现线程来实现这一点。我该怎么做呢 代码如下:Java 穿线秒表,java,multithreading,Java,Multithreading,我正在尝试创建4个秒表,它们都同时运行。他们都是在节目开始时开始的 我希望用户能够使用Q、W、E、R键加速秒表(按照键盘模式从左到右)。我已经建立了几乎所有的东西,但它不会让我按任何其他键,但R键加快第四个时钟 我想实现线程来实现这一点。我该怎么做呢 代码如下: public class Stopwatches extends Application { @Override public void start(Stage primaryStage) { T
public class Stopwatches extends Application {
@Override
public void start(Stage primaryStage) {
Time time1 = new Time();
Time time2 = new Time();
Time time3 = new Time();
Time time4 = new Time();
Text text1 = new Text("00:00:00");
Text text2 = new Text("00:00:00");
Text text3 = new Text("00:00:00");
Text text4 = new Text("00:00:00");
text1.setFont(Font.font("Times", 35));
text2.setFont(Font.font("Times", 35));
text3.setFont(Font.font("Times", 35));
text4.setFont(Font.font("Times", 35));
Timeline textClock1 = createTextStopwatch(time1, text1);
textClock1.play();
Timeline textClock2 = createTextStopwatch(time2, text2);
textClock2.play();
Timeline textClock3 = createTextStopwatch(time3, text3);
textClock3.play();
Timeline textClock4 = createTextStopwatch(time4, text4);
textClock4.play();
BorderPane pane = new BorderPane();
TilePane tilePane = new TilePane();
tilePane.setPadding(new Insets(15,5,5,5));
tilePane.setAlignment(Pos.CENTER);
tilePane.setHgap(40.0);
tilePane.getChildren().addAll(text1, text2, text3, text4);
pane.setCenter(tilePane);
Scene scene = new Scene(pane, 1500, 400);
scene.setOnKeyPressed(e -> {
if (e.getCode() == Q ){
textClock1.setRate(20.0);
}
});
scene.setOnKeyReleased(e -> {
if (e.getCode() == Q ){
textClock1.setRate(1.0);
}
});
scene.setOnKeyPressed(e -> {
if (e.getCode() == W ){
textClock2.setRate(20.0);
}
});
scene.setOnKeyReleased(e -> {
if (e.getCode() == W ){
textClock2.setRate(1.0);
}
});
scene.setOnKeyPressed(e -> {
if (e.getCode() == E ){
textClock3.setRate(20.0);
}
});
scene.setOnKeyReleased(e -> {
if (e.getCode() == E ){
textClock3.setRate(1.0);
}
});
scene.setOnKeyPressed(e -> {
if (e.getCode() == R ){
textClock4.setRate(20.0);
}
});
scene.setOnKeyReleased(e -> {
if (e.getCode() == R ){
textClock4.setRate(1.0);
}
});
primaryStage.setTitle("Stop Watch");
primaryStage.setScene(scene);
primaryStage.show();
}
public Timeline createTextStopwatch(Time time, Text text) {
Timeline animation = new Timeline(
new KeyFrame(Duration.millis(1000), e -> {
time.increase();
text.setText(time.toString());
}));
animation.setCycleCount(Timeline.INDEFINITE);
return animation;
}
public static void main(String[] args) {
launch(args);
}
}
我第二次尝试实现多线程,但它就是不起作用
public class Stopwatches extends Application {
@Override
public void start(Stage primaryStage) {
Time time1 = new Time();
Time time2 = new Time();
Time time3 = new Time();
Time time4 = new Time();
Text text1 = new Text("00:00:00");
Text text2 = new Text("00:00:00");
Text text3 = new Text("00:00:00");
Text text4 = new Text("00:00:00");
text1.setFont(Font.font("Times", 35));
text2.setFont(Font.font("Times", 35));
text3.setFont(Font.font("Times", 35));
text4.setFont(Font.font("Times", 35));
Timeline textClock1 = createTextStopwatch(time1, text1);
textClock1.play();
Timeline textClock2 = createTextStopwatch(time2, text2);
textClock2.play();
Timeline textClock3 = createTextStopwatch(time3, text3);
textClock3.play();
Timeline textClock4 = createTextStopwatch(time4, text4);
textClock4.play();
BorderPane pane = new BorderPane();
TilePane tilePane = new TilePane();
tilePane.setPadding(new Insets(15,5,5,5));
tilePane.setAlignment(Pos.CENTER);
tilePane.setHgap(40.0);
tilePane.getChildren().addAll(text1, text2, text3, text4);
pane.setCenter(tilePane);
Scene scene = new Scene(pane, 1500, 400);
Runnable task1 = new IncreaseTime(textClock1);
Runnable task2 = new DecreaseTime(textClock1);
Runnable task3 = new IncreaseTime(textClock2);
Runnable task4 = new DecreaseTime(textClock2);
Runnable task5 = new IncreaseTime(textClock3);
Runnable task6 = new DecreaseTime(textClock3);
Runnable task7 = new IncreaseTime(textClock4);
Runnable task8 = new DecreaseTime(textClock4);
Thread thread1 = new Thread(task1);
Thread thread2 = new Thread(task2);
Thread thread3 = new Thread(task3);
Thread thread4 = new Thread(task4);
Thread thread5 = new Thread(task5);
Thread thread6 = new Thread(task6);
Thread thread7 = new Thread(task7);
Thread thread8 = new Thread(task8);
scene.setOnKeyPressed(e -> {
if (e.getCode() == Q ){
thread1.start();
}
});
scene.setOnKeyReleased(e -> {
if (e.getCode() == Q ){
thread2.start();
}
});
scene.setOnKeyPressed(e -> {
if (e.getCode() == W ){
thread3.start();
}
});
scene.setOnKeyReleased(e -> {
if (e.getCode() == W ){
thread4.start();
}
});
scene.setOnKeyPressed(e -> {
if (e.getCode() == E ){
thread5.start();
}
});
scene.setOnKeyReleased(e -> {
if (e.getCode() == E ){
thread6.start();
}
});
scene.setOnKeyPressed(e -> {
if (e.getCode() == R ){
thread7.start();
}
});
scene.setOnKeyReleased(e -> {
if (e.getCode() == R ){
thread8.start();
}
});
primaryStage.setTitle("Stop Watch");
primaryStage.setScene(scene);
primaryStage.show();
}
public Timeline createTextStopwatch(Time time, Text text) {
Timeline animation = new Timeline(
new KeyFrame(Duration.millis(1000), e -> {
time.increase();
text.setText(time.toString());
}));
animation.setCycleCount(Timeline.INDEFINITE);
return animation;
}
public static void main(String[] args) {
launch(args);
}
}
class IncreaseTime implements Runnable {
Timeline textClock;
public IncreaseTime(Timeline textClock) {
this.textClock = textClock;
}
@Override
public void run() {
textClock.setRate(20.0);
}
}
class DecreaseTime implements Runnable {
Timeline textClock;
public DecreaseTime(Timeline textClock) {
this.textClock = textClock;
}
@Override
public void run() {
textClock.setRate(1.0);
}
}
我忘了显示我的第二个类,它制作时间对象,这里是:
public class Time {
int value = 0;
int getSecond() {
return value % 60;
}
int getMinute() {
return (value / 60) % 60;
}
int getHour() {
return value / 3600;
}
void reset() {
value = 0;
}
void increase() {
value++;
}
@Override
public String toString() {
return getTwoDigitString(getHour()) + ":" + getTwoDigitString(getMinute())
+ ":" + getTwoDigitString(getSecond());
}
static String getTwoDigitString(int v) {
if (v < 10)
return "0" + v;
else
return "" + v;
}
}
公共课时间{
int值=0;
int getSecond(){
返回值%60;
}
int getMinute(){
返回值(值/60)%60;
}
int getHour(){
返回值/3600;
}
无效重置(){
数值=0;
}
空隙增加(){
值++;
}
@凌驾
公共字符串toString(){
返回getTwoDigitString(getHour())+“:”+getTwoDigitString(getMinute())
+“:”+getTwoDigitString(getSecond());
}
静态字符串getTwoDigitString(int v){
如果(v<10)
返回“0”+v;
其他的
返回“+v”;
}
}
该应用程序将获得您所有的按钮按下次数Q、W、E、R
问题是您的所有setOnKeyReleased方法都是在textClock4上设置的。
所以我相信你认为这只是让你的R按钮按下
听起来像你想要的地方
Q to operate on textClock1
W to operate on textClock2
E to operate on textClock3
R to operate on textClock4
调试提示是在控制台接收到的按钮按下时,从场景向控制台添加打印语句。你开始细分并缩小问题在代码中的位置。该应用程序将获得你所有的按键Q、W、E、R 问题是您的所有setOnKeyReleased方法都是在textClock4上设置的。 所以我相信你认为这只是让你的R按钮按下 听起来像你想要的地方
Q to operate on textClock1
W to operate on textClock2
E to operate on textClock3
R to operate on textClock4
调试提示是在控制台接收到的按钮按下时,从场景向控制台添加打印语句。您开始细分并缩小问题在代码中的位置。您的事件侦听器正在覆盖它们自己。使用一个setOnKeyPressed和一个setOnKeyReleased来实现if-then-else的逻辑。您的事件侦听器正在覆盖它们自己。使用一个setOnKeyPressed和一个setOnKeyReleased来实现if then else的逻辑。I修复了您指出的错误,但当R被按下和释放时,它仍然只会增加和减少textClock4。请确保对您的问题的正确答案进行投票@马斯特卡西姆一针见血。我今天才回到这里。我已经修复了你指出的错误,但当R被按下和释放时,它仍然只会增加和减少textClock4。嘿,确保对你的问题的正确答案进行投票@马斯特卡西姆一针见血。我今天才回到这里。