Bahagian ini membentangkan program yang memaparkan bola yang melantun dan membolehkan pengguna menambah dan mengeluarkan bola.
Bahagian membentangkan program yang memaparkan satu bola yang melantun. Bahagian ini membentangkan program yang memaparkan berbilang bola melantun. Anda boleh menggunakan dua butang untuk menggantung dan menyambung semula pergerakan bola, bar skrol untuk mengawal kelajuan bola dan butang + atau - menambah atau mengeluarkan bola, seperti ditunjukkan dalam Rajah di bawah.
Contoh dalam Bahagian hanya perlu menyimpan satu bola. Bagaimanakah anda menyimpan berbilang bola dalam contoh ini? Kaedah Pane's getChildren() mengembalikan ObservableList, subjenis List, untuk menyimpan nod dalam anak tetingkap. Pada mulanya, senarai itu kosong. Apabila bola baharu dibuat, tambahkannya pada penghujung senarai. Untuk mengeluarkan bola, cuma alih keluar bola terakhir dalam senarai.
Setiap bola mempunyai keadaannya: koordinat x-, y, warna dan arah untuk bergerak. Anda boleh menentukan kelas bernama Bola yang memanjangkan javafx.scene.shape.Circle. Koordinat x-, y dan warna sudah ditakrifkan dalam Bulatan. Apabila bola dicipta, ia bermula dari sudut kiri atas dan bergerak ke bawah ke kanan. Warna rawak diberikan kepada bola baharu.
Kelas MultiplBallPane bertanggungjawab untuk memaparkan bola dan kelas MultipleBounceBall meletakkan komponen kawalan dan melaksanakan kawalan. Hubungan kelas-kelas ini ditunjukkan dalam Rajah di bawah. Kod di bawah memberikan program.
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 } } }
Kaedah add() mencipta bola baharu dengan warna rawak dan menambahkannya pada anak tetingkap (baris 73). Anak tetingkap menyimpan semua bola dalam senarai. Kaedah tolak() mengalih keluar bola terakhir dalam senarai (baris 78).
Apabila pengguna mengklik butang +, bola baharu ditambahkan pada anak tetingkap (baris 32). Apabila pengguna mengklik butang -, bola terakhir dalam senarai tatasusunan dialih keluar (baris 33).
Kaedah moveBall() dalam kelas MultipleBallPane mendapatkan setiap bola dalam senarai anak tetingkap dan melaraskan kedudukan bola (baris 114–115).
Atas ialah kandungan terperinci Kajian Kes: Bola Melantun. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!