튀는 공을 표시하고 사용자가 공을 추가하고 제거할 수 있는 프로그램을 소개합니다.
섹션에서는 튀는 공 하나를 표시하는 프로그램을 제공합니다. 이 섹션에서는 여러 개의 튀는 공을 표시하는 프로그램을 제공합니다. 아래 그림과 같이 두 개의 버튼을 사용하여 공의 이동을 일시 중지 및 재개하고 스크롤 막대를 사용하여 공 속도를 제어할 수 있으며 + 또는 - 버튼을 사용하여 공을 추가하거나 제거할 수 있습니다.
섹션의 예에서는 공 하나만 저장해야 했습니다. 이 예에서는 여러 개의 공을 어떻게 저장합니까? Pane의 getChildren() 메소드는 페인에 노드를 저장하기 위해 List의 하위 유형인 ObservableList를 반환합니다. 처음에는 목록이 비어 있습니다. 새로운 공이 생성되면 목록 끝에 추가하세요. 공을 제거하려면 목록에서 마지막 공을 제거하면 됩니다.
각 공에는 x, y 좌표, 색상, 이동 방향 등의 상태가 있습니다. javafx.scene.shape.Circle을 확장하는 Ball이라는 클래스를 정의할 수 있습니다. x, y 좌표와 색상은 원에 이미 정의되어 있습니다. 공이 생성되면 왼쪽 상단에서 시작하여 오른쪽 아래로 이동합니다. 새로운 공에 임의의 색상이 지정됩니다.
MultiplBallPane 클래스는 공을 표시하는 역할을 하며 MultipleBounceBall 클래스는 컨트롤 구성 요소를 배치하고 컨트롤을 구현합니다. 이러한 클래스의 관계는 아래 그림에 나와 있습니다. 아래 코드는 프로그램을 제공합니다.
package application; import javafx.animation.KeyFrame; import javafx.animation.Timeline; import javafx.application.Application; import javafx.beans.property.DoubleProperty; import javafx.geometry.Pos; import javafx.scene.Node; import javafx.stage.Stage; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.ScrollBar; import javafx.scene.layout.BorderPane; import javafx.scene.layout.HBox; import javafx.scene.layout.Pane; import javafx.scene.paint.Color; import javafx.scene.shape.Circle; import javafx.util.Duration; public class MultipleBounceBall extends Application { @Override // Override the start method in the Application class public void start(Stage primaryStage) { MultipleBallPane ballPane = new MultipleBallPane(); ballPane.setStyle("-fx-border-color: yellow"); Button btAdd = new Button("+"); Button btSubtract = new Button("-"); HBox hBox = new HBox(10); hBox.getChildren().addAll(btAdd, btSubtract); hBox.setAlignment(Pos.CENTER); // Add or remove a ball btAdd.setOnAction(e -> ballPane.add()); btSubtract.setOnAction(e -> ballPane.subtract()); // Pause and resume animation ballPane.setOnMousePressed(e -> ballPane.pause()); ballPane.setOnMouseReleased(e -> ballPane.play()); // Use a scroll bar to control animation speed ScrollBar sbSpeed = new ScrollBar(); sbSpeed.setMax(20); sbSpeed.setValue(10); ballPane.rateProperty().bind(sbSpeed.valueProperty()); BorderPane pane = new BorderPane(); pane.setCenter(ballPane); pane.setTop(sbSpeed); pane.setBottom(hBox); // Create a scene and place the pane in the stage Scene scene = new Scene(pane, 250, 150); primaryStage.setTitle("MultipleBounceBall"); // Set the stage title primaryStage.setScene(scene); // Place the scene in the stage primaryStage.show(); // Display the stage } public static void main(String[] args) { Application.launch(args); } private class MultipleBallPane extends Pane { private Timeline animation; public MultipleBallPane() { // Create an animation for moving the ball animation = new Timeline(new KeyFrame(Duration.millis(50), e -> moveBall())); animation.setCycleCount(Timeline.INDEFINITE); animation.play(); // Start animation } public void add() { Color color = new Color(Math.random(), Math.random(), Math.random(), 0.5); getChildren().add(new Ball(30, 30, 20, color)); } public void subtract() { if(getChildren().size() > 0) { getChildren().remove(getChildren().size() - 1); } } public void play() { animation.play(); } public void pause() { animation.pause(); } public void increaseSpeed() { animation.setRate(animation.getRate() + 0.1); } public void decreaseSpeed() { animation.setRate(animation.getRate() > 0 ? animation.getRate() - 0.1 : 0); } public DoubleProperty rateProperty() { return animation.rateProperty(); } protected void moveBall() { for(Node node: this.getChildren()) { Ball ball = (Ball)node; // Check boundaries if(ball.getCenterX() < ball.getRadius() || ball.getCenterX() > getWidth() - ball.getRadius()) { ball.dx *= -1; // Change ball move direction } if(ball.getCenterY() < ball.getRadius() || ball.getCenterY() > getHeight() - ball.getRadius()) { ball.dy *= -1; // Change ball move direction } // Adjust ball position ball.setCenterX(ball.dx + ball.getCenterX()); ball.setCenterY(ball.dy + ball.getCenterY()); } } } class Ball extends Circle { private double dx = 1, dy = 1; Ball(double x, double y, double radius, Color color) { super(x, y, radius); setFill(color); // Set ball color } } }
add() 메소드는 임의의 색상으로 새 공을 생성하여 창에 추가합니다(73행). 창은 모든 공을 목록에 저장합니다. subtract() 메소드는 목록(78행)의 마지막 공을 제거합니다.
사용자가 + 버튼을 클릭하면 새 공이 창에 추가됩니다(32행). 사용자가 - 버튼을 클릭하면 배열 목록의 마지막 공이 제거됩니다(33행).
MultipleBallPane 클래스의 moveBall() 메서드는 창 목록의 모든 공을 가져와서 공의 위치를 조정합니다(114~115행).
위 내용은 사례 연구: 튀는 공의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!