从ObservableLista 中删除项目时,将触发更改事件,其中getFrom()提供删除的位置并getRemoved()提供已删除的项目列表.文件说:
该
getRemoved()方法返回已从列表中替换或删除的元素列表.
它没有这样说,但我暗示项目列表是原始列表中的连续子列表.我已经用这个假设编写了很多代码,但是现在我TreeTableView的选择模型遇到了困难,而这种模式并没有这样做.
以一个带有三个"Node"行的简单树表为例.如果我选择那三行......
...然后单击并选择中间行...
...触发的更改事件treeTableView.getSelectionModel().getSelectedItems()如下所示:
{ [TreeItem [ value: Node 1 ], TreeItem [ value: Node 3 ]] removed at 0, }
Run Code Online (Sandbox Code Playgroud)
在单个更改事件中,它报告从selectedItems列表的索引0中删除了"节点1"和"节点3" .
我原以为该Change对象有两个由next()调用分隔的独立删除事件.第一次调用next()将告诉我"节点1"在索引0处被删除,第二次调用next()将告诉我"节点3"在索引1处被删除.但是不,我得到一个单独的事件,其中两行都列在一旦.
getRemoved()真的可以退回不连续的物品吗?这是我对列表更改事件如何工作的误解,还是一个错误TreeTableView?
通常我会犹豫是否会责怪标准库,但这不是我在JavaFX中发现的第一个错误,所以这不是不可想象的.
如果我添加一个调用setShowRoot(false),行为会发生变化.我得到了我所期望的,删除分为两部分:
{ [TreeItem [ value: Node 1 ]] removed at 0, [TreeItem [ …Run Code Online (Sandbox Code Playgroud) 是否有任何简单的方法让TreeTableView(或TableView)尝试在焦点丢失时提交值?
不幸的是,我没有成功使用javafx TableCellFactories的任何默认实现,这就是为什么我尝试了自己的TreeTableCell实现以及一些不同的tableCell实现,比如来自Graham Smith的实现,这似乎是最直接的,因为它已经实现了一个钩子焦点丢失,但仍然没有提交值,用户更改重置为原始值.
我的猜测是,每当焦点丢失时,受影响的Cell的editingProperty总是为false,这导致Cell永远不会在focusLost上提交值.这里是原始(oracle-)TreeTableCell实现(8u20ea)的相关部分,它导致我的方法失败:
@Override public void commitEdit(T newValue) {
if (! isEditing()) return; // <-- here my approaches are blocked, because on focus lost its not editing anymore.
final TreeTableView<S> table = getTreeTableView();
if (table != null) {
@SuppressWarnings("unchecked")
TreeTablePosition<S,T> editingCell = (TreeTablePosition<S,T>) table.getEditingCell();
// Inform the TableView of the edit being ready to be committed.
CellEditEvent<S,T> editEvent = new CellEditEvent<S,T>(
table,
editingCell,
TreeTableColumn.<S,T>editCommitEvent(),
newValue
);
Event.fireEvent(getTableColumn(), editEvent);
}
// inform parent classes of the commit, …Run Code Online (Sandbox Code Playgroud) TreeItem<FileModel> root = new TreeItem<FileModel>(playlist);
treeTblViewFiles.setRoot(root);
treeTblViewFiles.setShowRoot(true);
Run Code Online (Sandbox Code Playgroud)
上面的代码设置了一个根项,但是我需要有几个所谓的根项,其中包含子项的可扩展列表.我怎么做?
提前致谢.
我想修改它的点击行为TreeTableView,但老实说,我不确定这样做的预期方式是什么样的,或者它是否可以以任何方式改变.
大多数用户抱怨目前的行为不一致.有时单击一个单元格已经折叠/展开了treeitem,有时需要双击.这与编辑模式的初始化一起可能是一种痛苦.所以我很乐意自己处理点击行为.
我能够将行为缩小到TreeTableCellBehavior类:
@Override
protected void handleClicks(MouseButton button, int clickCount, boolean isAlreadySelected) {
// handle editing, which only occurs with the primary mouse button
TreeItem<S> treeItem = getControl().getTreeTableRow().getTreeItem();
if (button == MouseButton.PRIMARY) {
if (clickCount == 1 && isAlreadySelected) {
edit(getControl());
} else if (clickCount == 1) {
// cancel editing
edit(null);
} else if (clickCount == 2 && treeItem.isLeaf()) {
// attempt to edit
edit(getControl());
} else if (clickCount % 2 == 0) {
// …Run Code Online (Sandbox Code Playgroud) 我制作了一个简单的JavaFX应用程序。在此应用程序中,有一个2列的树形表和一个复选框。如果选中此复选框,则第2列将可见,否则不可见。为此,我将树形表的列可见属性绑定到复选框selected属性。当我单击复选框时,列状态会发生变化,但同时会给出。
原因:java.lang.RuntimeException:TreeTableColumn.visible:无法设置绑定值。
如果我使用双向绑定,则不会出现此错误。但是我不需要双向绑定。是错误还是我没有正确使用绑定?请使用下面的代码重现此错误。我使用jdk1.8.0_111。
JavaFXApplication.java
package test;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class JavaFXApplication extends Application {
@Override
public void start(Stage stage) throws Exception {
Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));
Scene scene = new Scene(root);
stage.setScene(scene);
stage.show();
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
launch(args);
}
}
Run Code Online (Sandbox Code Playgroud)
FXMLDocumentController.java
package test;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.CheckBox;
import javafx.scene.control.Label;
import javafx.scene.control.TreeTableColumn;
import …Run Code Online (Sandbox Code Playgroud) 任何人都可以建议我如何实现TreeTableView组件的过滤?我正在使用jdk 1.8.20
谢谢你阅读我的问题.
我正在使用TreeTableView,并设法通过遵循此答案中提出的结果将布尔值显示在其中一列中.它工作正常,但是应用时,复选框有一个TOP_LEFT对齐,而不是CENTER对齐(CENTER对齐是使用常规TableView上的复选框的默认值):

这是我正在进行的TOP_LEFT对齐
我搜索过,但是将对齐更改为单元格内容的常规解决方案在此处不起作用,根本不会产生任何结果.
有没有办法将对齐方式更改为CENTER或TOP_CENTER?我正在使用Java8.
编辑更多信息 GUI是用FXML制作的,TreeTableView在TitledPane中.使用此解决方案居中文本单元格(相同的表,其他列)工作正常.从其他列中删除它不会影响Checkbox列
我尝试以两种不同的方式添加Checkbox,但它们都具有TOP_LEFT对齐方式:
colUsable.setCellFactory(CheckBoxTreeTableCell.forTreeTableColumn(colUsable));
Run Code Online (Sandbox Code Playgroud)
而另一个尝试:
colUsable.setCellFactory(new Callback<TreeTableColumn<MyType,Boolean>,TreeTableCell<MyType,Boolean>>() {
@Override
public TreeTableCell<MyType,Boolean> call( TreeTableColumn<MyType,Boolean> p ) {
return new CheckBoxTreeTableCell<>();
}
});
Run Code Online (Sandbox Code Playgroud)
非常感谢.
我有一个TreeTableView每个节点都有一个图标的地方.当我展开树时,一切都很完美,但是当我折叠树时,不再可见的项目的图标会被遗忘.
删除行和文本,但图标保持"自由浮动".在屏幕截图中,您可以看到TreeTableView两次,一次使用正确的文本进行扩展,一次只有剩余的图标折叠.
上面的屏幕截图是根据以下最小示例创建的(您只需添加自己的示例icon.png):
import javafx.application.Application;
import javafx.beans.property.ReadOnlyStringWrapper;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.TreeTableColumn;
import javafx.scene.control.TreeTableColumn.CellDataFeatures;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeTableView;
import javafx.stage.Stage;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
public class TreeTableViewSample extends Application {
private static final Image icon = new Image(TreeTableViewSample.class.getResourceAsStream("icon.png"));
public static void main(String[] args) {
Application.launch(args);
}
@Override
public void start(Stage stage) {
stage.setTitle("Tree Table View Samples");
final Scene scene = new Scene(new Group(), 200, 400);
Group sceneRoot = (Group)scene.getRoot();
//Creating tree items
final …Run Code Online (Sandbox Code Playgroud) 我在 TreeTableView 上遇到 CSS 问题。
对于 TableView,当我像这样定义 CSS 时:
.table-row-cell:selected{
-fx-background-color: #f1734f;
-fx-background-insets: 0;
-fx-background-radius: 1;
-fx-table-cell-border-color: white;
-fx-text-fill: white;
}
Run Code Online (Sandbox Code Playgroud)
即使我单击表格外,所选行的文本也会显示为白色
对于 TreeTableView 我定义了这样的 CSS:
.tree-table-row-cell:selected{
-fx-background-color: #f1734f;
-fx-background-insets: 0;
-fx-background-radius: 1;
-fx-table-cell-border-color: white;
-fx-text-fill: white;
}
Run Code Online (Sandbox Code Playgroud)
所选行的文本为白色,但当我单击表格外时,文本变为黑色
有人知道我该如何解决这个问题吗?
谢谢
如何自定义树根项目的折叠外观?通过自定义我的意思是设置一个图像并将小三角形(/新图像)放在其单元格中.
提前致谢.
我现在正在学习JavaFX,我似乎无法做到正确.基本上我正在尝试做的是具有多个选择的TreeTableView,它可以正常工作,直到我尝试对列表进行排序.
这是代码(示例15-1带有一列的TreeTableView来自http://docs.oracle.com/javase/8/javafx/user-interface-tutorial/tree-table-view.htm#CJAEIFDC):
import javafx.application.Application;
import javafx.beans.property.ReadOnlyStringWrapper;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.TreeTableColumn;
import javafx.scene.control.TreeTableColumn.CellDataFeatures;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeTableView;
import javafx.stage.Stage;
public class TreeTableViewSample extends Application {
public static void main(String[] args) {
Application.launch(args);
}
@Override
public void start(Stage stage) {
stage.setTitle("Tree Table View Samples");
final Scene scene = new Scene(new Group(), 200, 400);
Group sceneRoot = (Group)scene.getRoot();
//Creating tree items
final TreeItem<String> childNode1 = new TreeItem<>("Child Node 1");
final TreeItem<String> childNode2 = new TreeItem<>("Child Node 2");
final TreeItem<String> …Run Code Online (Sandbox Code Playgroud) 关于FX,CSS和TreeTableView,我遇到了一些麻烦.我有包含蓝色超链接的单元格.现在,如果选择了单元格,则背景变为蓝色,因此链接几乎不可见.我现在想用Stylesheets更改所选单元格的背景颜色.
对于TreeView,以下工作正常:
.tree-view .tree-cell:selected{
-fx-background-color: green;
}
Run Code Online (Sandbox Code Playgroud)
所以类似地我试过:
.tree-table-view .tree-table-cell:selected{
-fx-background-color: green;
}
Run Code Online (Sandbox Code Playgroud)
但这没有效果.令人惊讶的是,虽然我能够改变一般的背景颜色:
.tree-table-view .tree-table-cell{
-fx-background-color: yellow;
}
Run Code Online (Sandbox Code Playgroud)
细胞现在都是黄色的,但这似乎覆盖了默认的选择模式,因为现在即使选择的行也有黄色背景.
对我来说,似乎状态选择器不适用于TreeTableView单元格,但我不知道如何以另一种方式实现.
我还尝试使用JavaFX文档中的示例15-2,获得了相同的不满意结果.
我无法在网上找到任何解决方案,因为所有问题似乎都是关于TreeViews或TableViews而不是组合的TreeTableView.所以任何提示或链接到正确的文档将是非常有帮助的!
提前致谢!
PS:我知道可以通过改变超链接的颜色来解决这个问题但是必须有办法改变单元格的颜色,对吗?
我正在使用TreeTableView,并且我想根据所选行内的数据更改与上下文菜单关联的菜单项。
假设我有一个结构如下的表:
访客
不休
在此表中,我们可以比喻说我们有两个根节点,分别是“访问者”和“ Chatters”。现在,我想有两个带有不同选项的上下文菜单。可以说,针对访问者的上下文菜单有一个项目是“邀请聊天”,另一个上下文菜单处理聊天者,并且具有不同的选项,例如:“踢”,“禁止”等。我的问题是如何实现这种情况?我应该在哪里使用这些上下文菜单?我应该将它们用于单元格,行还是表格?
treetableview ×13
javafx ×9
java ×8
javafx-8 ×5
css ×2
alignment ×1
behavior ×1
checkbox ×1
collapse ×1
contextmenu ×1
focus ×1
java-8 ×1
javafx-css ×1
jxtreetable ×1
mouseevent ×1
sorting ×1
tableview ×1