Tổng quan về đa phương tiện trong JavaFX
JavaFX cung cấp bộ công cụ mạnh mẽ để xử lý âm thanh và video thông qua các lớp chuyên biệt. Kiến trúc xử lý media được xây dựng dựa trên ba thành phần cốt lõi: Media đại diện cho nội dung số, MediaPlayer điều khiển quá trình phát, và MediaView hiển thị hình ảnh video lên giao diện.
Đoạn mã sau minh họa cách thiết lập một trình phát video cơ bản:
String videoUrl = "http://www.sample-videos.com/video/mp4/240/big_buck_bunny_240p_1mb.mp4";
Media videoContent = new Media(videoUrl);
MediaPlayer player = new MediaPlayer(videoContent);
MediaView videoDisplay = new MediaView(player);
StackPane rootContainer = new StackPane();
rootContainer.getChildren().add(videoDisplay);
Scene mainScene = new Scene(rootContainer, 640, 480);
primaryStage.setScene(mainScene);
primaryStage.show();
player.play();Khả năng xử lý âm thanh
Lớp MediaPlayer cung cấp nhiều thuộc tính cho việc tùy chỉnh trải nghiệm nghe nhìn. Các thông số như thời điểm phát, số lần lặp lại, và âm lượng đều có thể điều chỉnh linh hoạt. Đặc biệt, tính năng phân tích phổ tần số cho phép truy xuất dữ liệu biên độ và pha tại mỗi dải tần số, mở ra khả năng xây dựng các hiệu ứng trực quan âm nhạc.
Hiệu ứng hình ảnh cho video
Thành phần MediaView có khả năng áp dụng các hiệu ứng đặc biệt thông qua hệ thống hiệu ứng của JavaFX. Ví dụ dưới đây sử dụng DisplacementMap để tạo hiệu ứng biến dạng hình ảnh:
FloatMap distortionData = new FloatMap();
distortionData.setWidth(640);
distortionData.setHeight(480);
for (int y = 0; y < 480; y++) {
for (int x = 0; x < 640; x++) {
float offset = (float) Math.sin(y * 0.05) * 20.0f;
distortionData.setSamples(x, y, offset, offset);
}
}
DisplacementMap videoEffect = new DisplacementMap();
videoEffect.setMapData(distortionData);
videoEffect.setWrap(true);
videoDisplay.setEffect(videoEffect);Điều khiển giao diện danh sách
ListView là thành phần giao diện hiển thị danh sách dữ liệu có khả năng cuộn. Điều khiển này hỗ trợ chế độ chọn đơn lẻ hoặc đa chọn, phù hợp cho việc trình bày tập hợp dữ liệu lớn.
ObservableList<String> colorCollection = FXCollections.observableArrayList(
"Đỏ", "Xanh dương", "Vàng", "Xanh lá"
);
ListView<String> colorListView = new ListView<>(colorCollection);
colorListView.setPrefSize(200, 150);
colorListView.getSelectionModel().selectedItemProperty().addListener(
(observableValue, previousColor, currentColor) -> {
System.out.println("Màu được chọn: " + currentColor);
}
);Điều khiển giao diện bảng
TableView cung cấp cách thức hiển thị dữ liệu dạng bảng với khả năng tùy chỉnh cao. Mỗi cột trong bảng được định nghĩa qua TableColumn và có thể thiết lập các factory để tùy biến cách hiển thị ô dữ liệu.
public class ProductRecord {
private final SimpleStringProperty productName;
private final SimpleDoubleProperty productPrice;
public ProductRecord(String name, double price) {
this.productName = new SimpleStringProperty(name);
this.productPrice = new SimpleDoubleProperty(price);
}
public String getProductName() { return productName.get(); }
public double getProductPrice() { return productPrice.get(); }
}
ObservableList<ProductRecord> productData = FXCollections.observableArrayList(
new ProductRecord("Máy tính xách tay", 15000000),
new ProductRecord("Điện thoại thông minh", 8000000),
new ProductRecord("Máy tính bảng", 6000000)
);
TableView<ProductRecord> productTableView = new TableView<>(productData);
TableColumn<ProductRecord, String> nameCol = new TableColumn<>("Tên sản phẩm");
nameCol.setCellValueFactory(cellData -> cellData.getValue().productName);
TableColumn<ProductRecord, Double> priceCol = new TableColumn<>("Giá tiền");
priceCol.setCellValueFactory(cellData -> cellData.getValue().productPrice.asObject());
productTableView.getColumns().addAll(nameCol, priceCol);Việc kết hợp các điều khiển nâng cao này với khả năng xử lý đa phương tiện tạo nên nền tảng vững chắc cho việc xây dựng các ứng dụng giao diện hiện đại và giàu tính năng trong JavaFX.