javafx模拟一个简单的两层电梯系统,只实现基本的升降功能
时间: 2023-06-27 22:08:26 浏览: 119
好的,下面是一个简单的两层电梯系统的JavaFX实现代码。
```java
import javafx.animation.TranslateTransition;
import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
import javafx.util.Duration;
public class TwoFloorElevator extends Application {
private static final int NUM_FLOORS = 2; // 电梯系统楼层数
private static final int ELEVATOR_WIDTH = 60; // 电梯宽度
private static final int ELEVATOR_HEIGHT = 80; // 电梯高度
private static final int FLOOR_HEIGHT = 200; // 每层楼高度
private static final Duration ELEVATOR_MOVE_DURATION = Duration.seconds(1); // 电梯移动时间
private int currentFloor = 1; // 当前电梯所在楼层
@Override
public void start(Stage primaryStage) throws Exception {
GridPane gridPane = new GridPane();
gridPane.setAlignment(Pos.CENTER);
gridPane.setVgap(10);
// 创建两层楼
for (int i = 1; i <= NUM_FLOORS; i++) {
StackPane floorPane = new StackPane();
floorPane.setPrefSize(ELEVATOR_WIDTH * 2, FLOOR_HEIGHT);
floorPane.setStyle("-fx-background-color: #CCCCCC");
floorPane.getChildren().add(new Rectangle(ELEVATOR_WIDTH, ELEVATOR_HEIGHT, Color.WHITE));
floorPane.getChildren().add(new Button("楼层 " + i));
gridPane.add(floorPane, 0, NUM_FLOORS - i);
}
// 创建电梯
StackPane elevatorPane = new StackPane();
elevatorPane.setPrefSize(ELEVATOR_WIDTH, ELEVATOR_HEIGHT);
elevatorPane.setStyle("-fx-background-color: #FF0000");
Button openButton = new Button("开门");
Button closeButton = new Button("关门");
Button upButton = new Button("上行");
Button downButton = new Button("下行");
openButton.setOnAction(event -> openDoor());
closeButton.setOnAction(event -> closeDoor());
upButton.setOnAction(event -> moveUp());
downButton.setOnAction(event -> moveDown());
GridPane elevatorControlPane = new GridPane();
elevatorControlPane.setAlignment(Pos.CENTER);
elevatorControlPane.setHgap(10);
elevatorControlPane.setVgap(10);
elevatorControlPane.addRow(0, openButton, closeButton);
elevatorControlPane.addRow(1, upButton, downButton);
elevatorPane.getChildren().addAll(new Rectangle(ELEVATOR_WIDTH, ELEVATOR_HEIGHT, Color.WHITE), elevatorControlPane);
gridPane.add(elevatorPane, 1, NUM_FLOORS - 1);
Scene scene = new Scene(gridPane, ELEVATOR_WIDTH * 3, FLOOR_HEIGHT * NUM_FLOORS);
primaryStage.setScene(scene);
primaryStage.show();
}
// 电梯开门
private void openDoor() {
System.out.println("电梯开门");
}
// 电梯关门
private void closeDoor() {
System.out.println("电梯关门");
}
// 电梯上行
private void moveUp() {
if (currentFloor < NUM_FLOORS) {
TranslateTransition tt = new TranslateTransition(ELEVATOR_MOVE_DURATION, getElevatorPane());
tt.setToY(FLOOR_HEIGHT * (NUM_FLOORS - currentFloor));
tt.setOnFinished(event -> {
currentFloor++;
System.out.println("电梯到达" + currentFloor + "楼");
});
tt.play();
}
}
// 电梯下行
private void moveDown() {
if (currentFloor > 1) {
TranslateTransition tt = new TranslateTransition(ELEVATOR_MOVE_DURATION, getElevatorPane());
tt.setToY(FLOOR_HEIGHT * (NUM_FLOORS - currentFloor - 1));
tt.setOnFinished(event -> {
currentFloor--;
System.out.println("电梯到达" + currentFloor + "楼");
});
tt.play();
}
}
// 获取电梯面板
private StackPane getElevatorPane() {
return (StackPane) ((GridPane) ((StackPane) getGridPane().getChildren().get(1)).getChildren().get(0)).getChildren().get(0);
}
// 获取主布局
private GridPane getGridPane() {
return (GridPane) ((Scene) getPrimaryStage().getScene()).getRoot();
}
// 获取主舞台
private Stage getPrimaryStage() {
return (Stage) primaryStage;
}
public static void main(String[] args) {
launch(args);
}
}
```
上述代码中,我们使用了`GridPane`布局来创建两层楼和电梯。每层楼都是一个`StackPane`,其中包含一个白色矩形和一个标识楼层的按钮。电梯也是一个`StackPane`,其中包含一个红色矩形和四个控制按钮,分别用于开门、关门、上行和下行。
在电梯控制按钮的事件处理器中,我们使用`TranslateTransition`来实现电梯的升降。在电梯到达目标楼层后,我们更新`currentFloor`变量,并输出到控制台上。
需要注意的是,上述代码中的电梯升降只是动画效果,实际上并没有对电梯位置进行真正的修改。如果需要实际修改电梯位置,可以在`TranslateTransition`的事件处理器中使用`setLayoutY`方法来修改电梯的纵向位置。
阅读全文