java实现机械表
时间: 2023-10-31 21:06:18 浏览: 37
机械表是一种模拟表,其内部采用机械结构来实现时间的显示。在Java中,可以使用JavaFX库来实现机械表的显示效果。下面是一个简单的JavaFX机械表实现代码示例:
```java
import javafx.animation.Animation;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Line;
import javafx.scene.text.Font;
import javafx.scene.text.FontWeight;
import javafx.scene.text.Text;
import javafx.stage.Stage;
import javafx.util.Duration;
import java.time.LocalTime;
public class MechanicalClock extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
Group root = new Group();
// 创建表盘
Circle dial = new Circle(150, 150, 120, Color.WHITE);
dial.setStroke(Color.BLACK);
dial.setStrokeWidth(2);
// 创建刻度线
for (int i = 0; i < 12; i++) {
double angle = Math.PI / 6 * i;
double x = Math.cos(angle) * 100 + 150;
double y = Math.sin(angle) * 100 + 150;
Line tick = new Line(x, y, 150 + Math.cos(angle) * 80, 150 + Math.sin(angle) * 80);
tick.setStroke(Color.BLACK);
tick.setStrokeWidth(2);
root.getChildren().add(tick);
}
// 创建指针
Line hourHand = new Line();
hourHand.setStartX(150);
hourHand.setStartY(150);
hourHand.setEndX(150);
hourHand.setEndY(100);
hourHand.setStroke(Color.BLACK);
hourHand.setStrokeWidth(4);
hourHand.setStrokeLineCap(Line.Cap.ROUND);
Line minuteHand = new Line();
minuteHand.setStartX(150);
minuteHand.setStartY(150);
minuteHand.setEndX(150);
minuteHand.setEndY(70);
minuteHand.setStroke(Color.BLACK);
minuteHand.setStrokeWidth(3);
minuteHand.setStrokeLineCap(Line.Cap.ROUND);
Line secondHand = new Line();
secondHand.setStartX(150);
secondHand.setStartY(150);
secondHand.setEndX(150);
secondHand.setEndY(40);
secondHand.setStroke(Color.RED);
secondHand.setStrokeWidth(2);
secondHand.setStrokeLineCap(Line.Cap.ROUND);
root.getChildren().addAll(dial, hourHand, minuteHand, secondHand);
// 创建数字时钟
Text digitalClock = new Text();
digitalClock.setFont(Font.font("Verdana", FontWeight.BOLD, 20));
digitalClock.setFill(Color.BLACK);
digitalClock.setX(110);
digitalClock.setY(290);
root.getChildren().add(digitalClock);
// 创建时间轴
Timeline timeline = new Timeline(new KeyFrame(Duration.seconds(1), event -> {
LocalTime currentTime = LocalTime.now();
double hours = currentTime.getHour();
double minutes = currentTime.getMinute();
double seconds = currentTime.getSecond();
// 更新指针位置
hourHand.setEndX(150 + Math.cos((hours % 12 + minutes / 60.0) * Math.PI / 6) * 60);
hourHand.setEndY(150 + Math.sin((hours % 12 + minutes / 60.0) * Math.PI / 6) * 60);
minuteHand.setEndX(150 + Math.cos(minutes * Math.PI / 30) * 80);
minuteHand.setEndY(150 + Math.sin(minutes * Math.PI / 30) * 80);
secondHand.setEndX(150 + Math.cos(seconds * Math.PI / 30) * 100);
secondHand.setEndY(150 + Math.sin(seconds * Math.PI / 30) * 100);
// 更新数字时钟
digitalClock.setText(String.format("%02d:%02d:%02d", (int) hours, (int) minutes, (int) seconds));
}));
timeline.setCycleCount(Animation.INDEFINITE);
timeline.play();
Scene scene = new Scene(root, 300, 350);
primaryStage.setScene(scene);
primaryStage.setTitle("Mechanical Clock");
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
```
该示例代码使用JavaFX库创建了一个机械表界面,包含表盘、刻度线、指针、数字时钟等组件。通过使用时间轴(Timeline)来更新指针位置和数字时钟的显示。在启动应用程序后,用户可以看到一个实时更新的机械表界面,并且指针和数字时钟都会随着时间的变化而变化。