- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我的 TreeView 由我自己的树填充。在 Node 类中,我有一个字段“type”,它是 NodeType 之一。问题是我想为每种类型的 NodeType 设置样式,例如“type1”文本颜色应为绿色,“type2”文本颜色应为红色。我是 javaFX 的新手。我找到了 james-d ( https://github.com/james-d/heterogeneous-tree-example ) 的解决方案,但在此示例中,css 样式取决于类名,我如何为类字段制作它?
最佳答案
我的理解是你想要一个 TreeCell
样式因 NodeType
而异的 Node
包含在 TreeItem
中说 TreeCell
.全部通过 CSS。我说得对吗?
假设我是对的,我可以想到两种方法来实现这一点;如果有少量已知 NodeType
,这两种方法效果最好秒。第一个涉及使用 PseudoClass第二个使用与 JavaFX 相同的策略 Chart
API。
创建自定义 TreeCell
适合使用您的 Node
类型(即适本地指定通用签名)。在这个习惯TreeCell
你声明了多少 PseudoClass
根据需要静态最终字段;每个人一个NodeType
.然后你观察 NodeType
什么的Node
当前显示在TreeCell
并更新 PseudoClass
据此说明。
这是一个假设 NodeType
的例子是一个 enum
有两个常量:HAPPY
和 SAD
.
public class CustomTreeCell<T extends Node> extends TreeCell<T> {
private static final PseudoClass HAPPY = PseudoClass.getPseudoClass("happy");
private static final PseudoClass SAD = PseudoClass.getPseudoClass("sad");
// this listener will activate/deactivate the appropriate PseudoClass states
private final ChangeListener<NodeType> listener = (obs, oldVal, newVal) -> {
pseudoClassStateChanged(HAPPY, newVal == NodeType.HAPPY);
pseudoClassStateChanged(SAD, newVal == NodeType.SAD);
};
// use a weak listener to avoid a memory leak
private final WeakChangeListener<NodeType> weakListener = /* wrap listener */;
public CustomTreeCell() {
getStyleClass().add("custom-tree-cell");
itemProperty().addListener((obs, oldVal, newVal) -> {
if (oldVal != null) {
oldVal.nodeTypeProperty().removeListener(weakListener);
}
if (newVal != null) {
newVal.nodeTypeProperty().addListener(weakListener);
// need to "observe" the initial NodeType of the new Node item.
// You could call the listener manually to avoid code duplication
pseudoClassStateChanged(HAPPY, newVal.getNodeType() == NodeType.HAPPY);
pseudoClassStateChanged(SAD, newVal.getNodeType() == NodeType.SAD);
} else {
// no item in this cell so deactivate all PseudoClass's
pseudoClassStateChanged(HAPPY, false);
pseudoClassStateChanged(SAD, false);
}
});
}
}
然后在您的 CSS 文件中您可以使用:
.custom-tree-cell:happy {
/* style when happy */
}
.custom-tree-cell:sad {
/* style when sad */
}
JavaFX 做什么 Chart
API 在处理多系列数据时执行。它所做的是动态更新 style class
节点的数量取决于列表中系列的索引(例如 .line-chart-series-data-<index>
<-- 可能完全不是这个)。
/*
* Create a custom TreeCell like in the first option but
* without any of the PseudoClass code. This listener should
* be added/removed from the Node item just like weakListener
* is above.
*/
ChangeListener<NodeType> listener = (obs, oldVal, newVal) -> {
// You have to make sure you keep "cell", "indexed-cell", and "tree-cell"
// in order to keep the basic modena styling.
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");
} else {
getStyleClass().setAll("cell", "indexed-cell", "tree-cell"); // revert to regular TreeCell style
}
};
然后在 CSS 中:
.custom-tree-cell-happy {
/* styles */
}
.custom-tree-cell-sad {
/* styles */
}
这两个选项实际上仅在存在一小组已知类型时才可行。当你有 10+ NodeType
之类的东西时,它可能变得无法维护。秒。如果 NodeType
的数量变得几乎不可能s 在运行时是动态的。
NodeType
可能更容易,或一些中间类/数据结构,知道文本应该是什么颜色并根据 NodeType
以编程方式设置颜色.
注意:我在回答中快速输入了代码,并没有测试它。我的代码中可能存在编译器错误、运行时异常或逻辑错误。
编辑
我想到了其他事情。我上面的代码假设 NodeType
保存在一个属性中,可以在运行时更改。如果NodeType
对于每个 Node
都是静态的(不变的)那么代码可以大大简化。您可以简单地覆盖 javafx.scene.control.Cell
中声明的以下方法,而不是使用任何监听器。 :
protected void updateItem(Node item, boolean empty)
每次在单元格上设置新元素时都会调用此方法。阅读 documentation ,但是,因为覆盖此方法需要开发人员执行某些操作(例如调用 super 实现)。
关于不同类字段的 JavaFX TreeItem css 样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49444909/
我正在使用 GWT ,我有树 Widget.TreeItems 在运行时添加。示例: 1.A 2.B 当我点击A时看起来像 1.A 1.ab 2.cd
我关注这个example to create a simple test with a Table where the foreground color was changed 。这按预期工作。 但是
我正在捕获右键单击事件以显示上下文菜单。我一直无法弄清楚的是,如何在显示上下文菜单之前右键单击实际选择 TreeItem。 感谢所有帮助。 private Tree tree = new Tree(
我目前正在使用 JavaFx-2 的 TreeView代表一个文件系统。 我想启用 drag and drop允许移动操作,但它看起来像 TreeItem不包括拖动事件监听器。我只能在 englobi
我想实现一棵树,里面有可检查的根节点和一些参数(实际上,本例中的参数并不重要)。因此,我制作一棵树,然后放置两列,然后放置一个 TreeItem。然后我需要放置一个带有复选框按钮的 TreeEdito
我有一个 TreeItem(一棵包含 100 多个 TreeItems 元素的树)。我想让用户能够隐藏(或再次显示)一些 TreeItems。 (因此用户只会看到他关心的项目)。 我看不到 TreeI
我正在 JavaFX 中使用 TreeView ,我想知道如何区分类型的节点,我的意思是,我有下一个结构: 1.-Agent 1.1-Use Case Diagram 1.1.1-U
我正在使用 TreeTableView (JavaFX 8)。有一些树节点,必须禁用才能选择。我已经尝试过选择事件,但它不起作用。请找到以下代码以获取更多信息。 treeTableView.getSe
我正在开发 Eclipse 插件。在这里我创建了一个单独的 View ,现在我想格式化树节点的颜色。 这些是 createpartcontrol 方法中的代码。 ScrolledComposite s
我有一个TreeViewer,其中当用户选择一个TreeItem并单击“展开”按钮时,应打开TreeItem下的整个层次结构,直到最后一个叶子找到节点。 我在 TreeViewer 上找到了一个现有方
我有一个 JFace TreeViewer,其中用户可以选择一个 TreeItem 并通过菜单选项检查是否是叶节点。 如何实现这一目标? 最佳答案 您可以通过以下方式从树查看器中获取当前选定的对象:
我正在尝试将包含文件路径的工具提示附加到 TreeItem ,这样当我将鼠标悬停在此 TreeItem 周围时,当我将鼠标悬停在其周围时,它将显示文件路径的文本。这在我的代码中不起作用,因为它提示我无
我有以下类(class): class TreeItem>{ private final ObservableList childs; private T parent; pu
我正在尝试创建一种方法来实现标题所说的功能。假设我有下面的 TreeView ,我想添加一个搜索功能,用户可以在其中给出例如一个值 desktop 并使用该方法获取具有给定值的第一个 TreeItem
有TreeView,每个元素都实现了Viewable接口(interface): public interface Viewable { enum ViewStyle { NE
在我的应用程序中,我有一个由树项组成的树结构。 我想做的是改变某些树元素的背景,如果他们的 userObject 满足某些条件。我遇到的问题是,当根树元素的背景发生变化时(仅根据根级别的树元素满足的标
我制作了这个 TreeView : TreeItem root = new TreeItem<>("roothidden"); treeView.setRoot(root);
编辑 #2:由于它看起来像一个错误,我已经在 javaFx-jira 中发布了错误报告.您必须拥有一个帐户才能访问该问题。如果有新信息,我会及时更新这篇文章。 原帖:我有一个带有按钮和 TreeVie
我有一个 TreeItem目的。 我想在里面放一个按钮。 Button button = new Button("Hello!"); root.setGraphic(button); // root
使用标准 GWT 2.0.3 API,如何向 TreeItem 添加 Clickhandler?我希望实现对服务器的异步调用,以检索展开的结果 TreeItem。 不幸的是FastTree在 GXT
我是一名优秀的程序员,十分优秀!