Sự hiểu biết của tôi là bạn muốn một Tế bào cây
nguyên nhân phong cách Loại nút
thay đổi Node
bao gồm trong CâyMục
Trung Sóc Tế bào cây
.all thông qua CSS. Tôi có đúng không?
Giả sử tôi đúng, tôi có thể nghĩ ra hai cách để thực hiện điều này nếu có một số ít người biết đến; Loại nút
, hai phương pháp này hoạt động hiệu quả nhất trong vài giây. Việc đầu tiên liên quan đến việc sử dụng Lớp giảCách thứ hai sử dụng chiến lược tương tự như JavaFX Biểu đồ
API.
lựa chọn đầu tiên
创建自定义 Tế bào cây
Thích hợp để sử dụng với Node
type (tức là chỉ định chữ ký chung một cách thích hợp). theo thói quen nàyTế bào cây
Bạn đã khai báo bao nhiêu? Lớp giả
Các trường cuối cùng tĩnh nếu cần;Loại nút
.Sau đó bạn quan sát Loại nút
thứ gì đóNode
Hiện đang hiển thị trongTế bào cây
và cập nhật Lớp giả
Giải thích cho phù hợp.
đây là một giả định Loại nút
Một ví dụ là một liệt kê
Có hai hằng số:VUI MỪNG
Và BUỒN
.
lớp công khai CustomTreeCell mở rộng TreeCell {
cuối cùng tĩnh riêng tư PseudoClass HAPPY = PseudoClass.getPseudoClass("hạnh phúc");
cuối cùng tĩnh riêng tư PseudoClass SAD = PseudoClass.getPseudoClass("buồn");
// trình nghe này sẽ kích hoạt/hủy kích hoạt các trạng thái PseudoClass thích hợp
riêng tư cuối cùng ChangeListener listen = (obs, oldVal, newVal) -> {
pseudoClassStateChanged(HAPPY, newVal == NodeType.HAPPY);
pseudoClassStateChanged(SAD, newVal == NodeType.SAD);
};
// sử dụng trình nghe yếu để tránh rò rỉ bộ nhớ
cuối cùng riêng tư WeakChangeListener yếuListener = /* quấn người nghe */;
công khai CustomTreeCell() {
getStyleClass().add("custom-tree-cell");
itemProperty().addListener((obs, oldVal, newVal) -> {
nếu (oldVal != null) {
oldVal.nodeTypeProperty().removeListener(weakListener);
}
nếu (newVal != null) {
newVal.nodeTypeProperty().addListener(weakListener);
// cần "quan sát" NodeType ban đầu của mục Node mới.
// Bạn có thể gọi trình nghe theo cách thủ công để tránh trùng lặp mã
pseudoClassStateChanged(HAPPY, newVal.getNodeType() == NodeType.HAPPY);
pseudoClassStateChanged(SAD, newVal.getNodeType() == NodeType.SAD);
} khác {
// không có mục nào trong ô này nên hãy hủy kích hoạt tất cả PseudoClass
pseudoClassStateChanged(HAPPY, false);
pseudoClassStateChanged(SAD, false);
}
});
}
}
Sau đó, trong tệp CSS của bạn, bạn có thể sử dụng:
.custom-tree-cell:hạnh phúc {
/* phong cách khi vui */
}
.custom-tree-cell:buồn {
/* phong cách khi buồn */
}
lựa chọn thứ hai
JavaFX làm gì Biểu đồ
API được thực thi khi xử lý nhiều chuỗi dữ liệu. Những gì nó làm là cập nhật động lớp phong cách
Số lượng nút phụ thuộc vào chỉ mục của chuỗi trong danh sách (ví dụ: .line-chart-series-data-
<-- có thể完全Không phải thế đâu).
/*
* Tạo TreeCell tùy chỉnh như trong tùy chọn đầu tiên nhưng
* không có bất kỳ mã PseudoClass nào.
* được thêm/xóa khỏi mục Node giống như yếuListener
* ở trên.
*/
ChangeListener listen = (obs, oldVal, newVal) -> {
// Bạn phải đảm bảo rằng bạn giữ "ô", "ô được lập chỉ mục" và "ô cây"
// để giữ kiểu dáng modena cơ bản.
if (newVal == NodeType.HAPPY) {
getStyleClass().setAll("cell", "indexed-cell", "tree-cell", "custom-tree-cell-happy");
} else if (newVal == NodeType.HAPPY) {
getStyleClass().setAll("cell", "indexed-cell", "tree-cell", "custom-tree-cell-sad");
} khác {
getStyleClass().setAll("cell", "indexed-cell", "tree-cell"); // trở lại kiểu TreeCell thông thường
}
};
Sau đó trong CSS:
.custom-tree-cell-hạnh phúc {
/* các kiểu */
}
.custom-tree-cell-buồn {
/* các kiểu */
}
Cả hai tùy chọn thực sự chỉ khả thi nếu có một tập hợp nhỏ các loại đã biết. Khi bạn có 10+ Loại nút
Khi điều gì đó như thế xảy ra, nó có thể trở nên không thể duy trì được. Thứ hai. nếu như Loại nút
Số lượng s gần như không thể thay đổi trong thời gian chạy.
Loại nút
Có thể dễ dàng hơn hoặc một số cấu trúc dữ liệu/lớp trung gian để biết văn bản nên có màu gì và dựa vào đó Loại nút
Đặt màu theo chương trình.
Lưu ý: Tôi đã nhanh chóng nhập mã vào câu trả lời của mình và không kiểm tra. Có thể có lỗi trình biên dịch, ngoại lệ thời gian chạy hoặc lỗi logic trong mã của tôi.
biên tập
Một cái gì đó khác xảy ra với tôi. Mã của tôi ở trên giả định Loại nút
Được lưu trong thuộc tính có thể thay đổi khi chạy. nếu nhưLoại nút
cho mỗi Node
Nếu tất cả đều tĩnh (không thay đổi), mã có thể được đơn giản hóa rất nhiều. Bạn chỉ có thể ghi đè javafx.scene.control.Cell
thay vì sử dụng bất kỳ trình nghe nào. :
protected void updateItem(Mục nút, boolean trống)
Phương thức này được gọi mỗi khi một phần tử mới được đặt trên ô. đọc documentation tuy nhiên, vì việc ghi đè phương thức này yêu cầu nhà phát triển phải thực hiện một số hành động nhất định (chẳng hạn như gọi siêu triển khai).
Tôi là một lập trình viên xuất sắc, rất giỏi!