gpt4 book ai didi

java - 在JavaFX中指定时间显示文本/形状

转载 作者:行者123 更新时间:2023-12-02 11:13:19 30 4
gpt4 key购买 nike

我在使用 javaFX 时遇到问题。我想每 1000 毫秒在应用程序窗口中显示一次时间。

public class Main extends Application {

StackPane root = new StackPane();
Time time;
Text t1;
@Override
public void start(Stage primaryStage) throws Exception{
root.setStyle("-fx-background-color: #00FF00");
primaryStage.setTitle("My App");
primaryStage.setScene(new Scene(root, 1000, 800));
primaryStage.show();
checkTime();


primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() {
@Override
public void handle(WindowEvent t) {
Platform.exit();
System.exit(0);
}
});
}


public static void main(String[] args) {
launch(args);
}

public void checkTime(){
time = new Time();
time.start();
}

public void displayTime(int hour, int minute, int second){
t1= new Text(200, 50, hour + ":" + minute + ":" + second);
root.getChildren().add(t1);
}


}

这是第二类:

package sample;


import java.util.Calendar;

public class Time extends Thread {

Thread t;
public int hour;
public int minute;
public int second;
Calendar calendar;
Main main = new Main();


Time() {
}

public void run() {
for (; ; ) {
try {
getTime();
Thread.sleep(1000);
} catch (InterruptedException e) {
}
}
}

public void start() {
t = new Thread(this);
t.start();

}

public void getTime() {
calendar = Calendar.getInstance();
hour = calendar.get(Calendar.HOUR);
minute = calendar.get(Calendar.MINUTE);
second = calendar.get(Calendar.SECOND);
System.out.println(hour + ":" + minute + ":" + second);
main.displayTime(hour, minute, second);

}


}

我希望它的工作方式与数字时钟类似。在项目的下一阶段中,我将希望使用与其他 2D 人物类似的方式。

此时,打开应用程序后,在控制台花费的时间是正确的。但是,我希望在应用程序窗口中显示完全相同的时间,此时仅显示背景而不显示其他内容。

最佳答案

  1. 大多数时候,您不需要直接从 Thread 进行扩展,因为 JavaFX 具有诸如 Timeline 之类的功能,可以充当计时器。如果您认为有必要(由于您未指定的其他原因),那么拥有 Time 类就完全没问题。
  2. Thread 扩展并创建另一个 Thread 绝对是不必要的。当Time类扩展Thread时,它本身已经是一个Thread
  3. 您正在 Time 中创建 Main 的新实例。 Main 应该创建 Time 并将其自身传递给 Time,否则 Time 将不会保存该对象的引用原始Main对象。
  4. 我认为即使你解决了#3,你在运行时也肯定会遇到一些异常。您正在通过非 JavaFX 应用程序线程(即您的 Time 类线程)直接修改场景图。此外,您在每个 Time 周期创建一个新的 Text 对象,因此即使没有异常(exception),这些 Text 对象也会与一个对象重叠另一个。

如果您出于其他特殊原因想要保留 Time 类,那么通常您应该这样做:

public class Main extends Application {
StackPane root = new StackPane();
Time time;
Text t1 = new Text(); // Instantiates only once

@Override
public void start(Stage primaryStage) throws Exception{
root.setStyle("-fx-background-color: #00FF00");
primaryStage.setTitle("My App");
primaryStage.setScene(new Scene(root, 1000, 800));
primaryStage.show();

root.getChildren().add(t1);

checkTime();


primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() {
@Override
public void handle(WindowEvent t) {
Platform.exit();
System.exit(0);
}
});
}


public static void main(String[] args) {
launch(args);
}

public void checkTime(){
time = new Time(this); // Pass ownself into Time
time.start();
}

public void updateTime(int hour, int minute, int second){
Platform.runLater(() -> t1.setText(200, 50, hour + ":" + minute + ":" + second));
}
}
public class Time extends Thread {
//Thread t; // Not needed
public int hour;
public int minute;
public int second;
Calendar calendar;
Main main; // Don't instantiate

// Pass in the main object
Time(Main main) {
this.main = main;
}

public void run() {
for (; ; ) {
try {
getTime();
Thread.sleep(1000);
} catch (InterruptedException e) {
}
}
}

// This is not needed, Time class has its own start() method, which will call its run() method.
//public void start() {
// t = new Thread(this);
// t.start();
//}

public void getTime() {
calendar = Calendar.getInstance();
hour = calendar.get(Calendar.HOUR);
minute = calendar.get(Calendar.MINUTE);
second = calendar.get(Calendar.SECOND);
System.out.println(hour + ":" + minute + ":" + second);
main.updateTime(hour, minute, second); // Update main
}
}

关于java - 在JavaFX中指定时间显示文本/形状,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50458044/

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