gpt4 book ai didi

java - 如何更改 TreeView (JavaFX) 中单个项目的背景颜色?

转载 作者:行者123 更新时间:2023-12-02 11:01:09 25 4
gpt4 key购买 nike

我是第一次使用 JavaFX,到目前为止我成功地完成了我想要的所有其他事情,但现在我陷入了困境。我正在使用 Treeview 来显示对象列表,每个对象都包含一个数值(使用了多少次),并且我想在 TreeView 上单独更改每个对象的背景颜色基于使用计数器。

即如果某个物体使用了 100 次,它应该呈红色,而使用次数较少的物体则呈黄色,类似于温度读数器。

非常感谢任何帮助!

谢谢,安德烈亚斯

最佳答案

使用单元工厂创建树单元,其 styleProperty 绑定(bind)到树中显示的项目的值:

import java.util.Random;

import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TreeCell;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;

public class TreeViewChangeBackgroundOnItem extends Application {

private TreeView<Item> tree;

@Override
public void start(Stage primaryStage) {
tree = new TreeView<>();
tree.setRoot(new TreeItem<>(new Item(0)));
tree.getRoot().setExpanded(true);
Random rng = new Random();
for (int i = 0 ; i < 10 ; i++) {
tree.getRoot().getChildren().add(
new TreeItem<>(new Item(rng.nextInt(100))));
}

tree.setCellFactory(tv -> new TreeCell<Item>() {
@Override
protected void updateItem(Item item, boolean empty) {
super.updateItem(item, empty);
styleProperty().unbind();
textProperty().unbind();
if (empty) {
setText("");
setStyle("");
} else {
textProperty().bind(item.valueProperty().asString("Value: %d"));
styleProperty().bind(Bindings.createStringBinding(() ->
String.format("-fx-background: #ff%02x00;",
computeGreen(item.getValue())),
item.valueProperty()));
}
}
});

Button inc = createAdjustButton("Increment", 1);

Button dec = createAdjustButton("Decrement", -1);

HBox buttons = new HBox(5, inc, dec);
buttons.setAlignment(Pos.CENTER);
buttons.setPadding(new Insets(10));

BorderPane root = new BorderPane(tree, null, null, buttons, null);
Scene scene = new Scene(root);
primaryStage.setScene(scene);
primaryStage.show();
}

private int computeGreen(int value) {
int clamped = Math.max(0, Math.min(value, 100));
return 255-255*clamped/100 ;
}

private Button createAdjustButton(String text, int delta) {
Button button = new Button(text);
button.setOnAction(e -> adjust(delta));
button.disableProperty().bind(tree.getSelectionModel().selectedItemProperty().isNull());
return button ;
}

private void adjust(int delta) {
Item selected = tree.getSelectionModel().getSelectedItem().getValue();
selected.setValue(selected.getValue()+delta);
}

public static class Item {
private final IntegerProperty value = new SimpleIntegerProperty();

public Item(int value) {
setValue(value);
}

public final IntegerProperty valueProperty() {
return this.value;
}


public final int getValue() {
return this.valueProperty().get();
}


public final void setValue(final int value) {
this.valueProperty().set(value);
}

}

public static void main(String[] args) {
launch(args);
}
}

关于java - 如何更改 TreeView (JavaFX) 中单个项目的背景颜色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35103132/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com