Java 穿线秒表

Java 穿线秒表,java,multithreading,Java,Multithreading,我正在尝试创建4个秒表,它们都同时运行。他们都是在节目开始时开始的 我希望用户能够使用Q、W、E、R键加速秒表(按照键盘模式从左到右)。我已经建立了几乎所有的东西,但它不会让我按任何其他键,但R键加快第四个时钟 我想实现线程来实现这一点。我该怎么做呢 代码如下: public class Stopwatches extends Application { @Override public void start(Stage primaryStage) { T

我正在尝试创建4个秒表,它们都同时运行。他们都是在节目开始时开始的

我希望用户能够使用Q、W、E、R键加速秒表(按照键盘模式从左到右)。我已经建立了几乎所有的东西,但它不会让我按任何其他键,但R键加快第四个时钟

我想实现线程来实现这一点。我该怎么做呢

代码如下:

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。嘿,确保对你的问题的正确答案进行投票@马斯特卡西姆一针见血。我今天才回到这里。