- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的问题是如何使用我自己的Comparator
创建一个treetableview(JavaFX8)。
我找到了一些例子,例如 JavaFX TableView Sort Policy但它们都是TableView
而不是TreeTableView
。
谢谢。
这是我的示例代码:
import java.util.Comparator;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.beans.property.ReadOnlyObjectWrapper;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.Insets;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeTableColumn;
import javafx.scene.control.TreeTableView;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.stage.Stage;
import javafx.util.Callback;
public class TableViewSampleWithoutEdit extends Application {
private TreeTableView<Person> table = new TreeTableView<Person>();
private ExtraPerson extraPerson = new ExtraPerson("Ninja Village");
TreeItem root = new TreeItem<>("root");
private final ObservableList<TreeItem<Person>> data = FXCollections
.observableArrayList(
new TreeItem<Person>( new Person("Jacob", "Smith", "jacob.smith@example.com")),
new TreeItem<Person>( new Person("Isabella", "Johnson","isabella.johnson@example.com")),
new TreeItem<Person>( new Person("Ethan", "Williams","ethan.williams@example.com")),
new TreeItem<Person>( new Person("Emma", "Jones", "emma.jones@example.com")),
new TreeItem<Person>( new Person("Michael", "Brown", "michael.brown@example.com")),
new TreeItem<Person>( extraPerson));
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage stage) {
Scene scene = new Scene(new Group());
stage.setTitle("Table View Sample");
stage.setWidth(450);
stage.setHeight(500);
final Label label = new Label("Address Book");
label.setFont(new Font("Arial", 20));
table.setEditable(true);
Platform.runLater(() -> {
TreeTableColumn<Person, String> firstNameCol = new TreeTableColumn("First Name");
firstNameCol.setMinWidth(100);
firstNameCol.setCellValueFactory(cellData -> {
if (cellData.getValue().getValue()instanceof Person) {
return new ReadOnlyObjectWrapper(cellData.getValue().getValue().getFirstName());
}
return new ReadOnlyObjectWrapper(cellData.getValue().getValue());
});
TreeTableColumn<Person, String> lastNameCol = new TreeTableColumn("Last Name");
lastNameCol.setMinWidth(100);
lastNameCol.setCellValueFactory(cellData -> {
if (cellData.getValue().getValue()instanceof Person) {
return new ReadOnlyObjectWrapper(cellData.getValue().getValue().getLastName());
}
return new ReadOnlyObjectWrapper(cellData.getValue().getValue());
});
/**
* Adding comparator to extraPerson
*/
table.sortPolicyProperty().set(
new Callback<TreeTableView<Person>, Boolean>() {
@Override
public Boolean call(final TreeTableView<Person> param) {
Comparator<TreeItem<Person>> comparator = new Comparator<TreeItem<Person>>() {
@Override
public int compare(TreeItem<Person> r1, TreeItem<Person> r2) {
if (r1.getValue() == extraPerson) {
return 1;
} else if (r2.getValue() == extraPerson) {
return -1;
} else if (param.getComparator() == null) {
return 0;
} else {System.out.println("c");
return param.getComparator()
.compare(r1, r2);
}
}
};
ObservableList<TreeItem<Person>> tables = FXCollections.observableArrayList();
for (int i = 0; i < table.getExpandedItemCount(); i++) {
tables.add(table.getTreeItem(0));
}
FXCollections.sort(tables,comparator);
if (tables.size()>0) {
table.getRoot().getChildren().setAll(tables);
}
return true;
}
});
root.getChildren().setAll(data);
table.setRoot(root);
table.getColumns().addAll(firstNameCol, lastNameCol);
root.setExpanded(true);
final VBox vbox = new VBox();
vbox.setSpacing(5);
vbox.setPadding(new Insets(10, 0, 0, 10));
vbox.getChildren().addAll(label, table);
((Group) scene.getRoot()).getChildren().addAll(vbox);
stage.setScene(scene);
stage.show();
}
public static class Person {
private final SimpleStringProperty firstName;
private final SimpleStringProperty lastName;
private final SimpleStringProperty email;
private Person(String fName, String lName, String email) {
this.firstName = new SimpleStringProperty(fName);
this.lastName = new SimpleStringProperty(lName);
this.email = new SimpleStringProperty(email);
}
public String getFirstName() {
return firstName.get();
}
public void setFirstName(String fName) {
firstName.set(fName);
}
public String getLastName() {
return lastName.get();
}
public void setLastName(String fName) {
lastName.set(fName);
}
public String getEmail() {
return email.get();
}
public void setEmail(String fName) {
email.set(fName);
}
}
public static class ExtraPerson extends Person {
private final SimpleStringProperty address;
private ExtraPerson(String address) {
super("Itachi", "Uchiha", "leaf@village.ninja");
this.address = new SimpleStringProperty(address);
}
public String getAddress() {
return address.get();
}
public void setAddress(String address) {
this.address.set(address);
}
}
}
最佳答案
只需替换这个...
ObservableList<TreeItem<Person>> tables = FXCollections.observableArrayList();
for (int i = 0; i < table.getExpandedItemCount(); i++) {
tables.add(table.getTreeItem(0));
}
FXCollections.sort(tables,comparator);
if (tables.size()>0) {
table.getRoot().getChildren().setAll(tables);
}
...有了这个...
if(table.getRoot() != null)
FXCollections.sort(table.getRoot().getChildren(), comparator);
...并且它会起作用(至少对于您问题中的 TreeTableView
)。
这与您在答案中提到的完全相同:
您创建了 Comparator用于 TreeTableView
中的对象集合。唯一的区别是您在不同的列表上使用此比较器:在链接的答案中,它用于比较 table.getItems()
我修改了它以用于 table.getRoot().getChildren()
(根节点的子节点)。
如果您添加多个 level1 TreeItem
,请注意,或者增加树级别,您必须对其进行调整,但工作流程是相同的。
关于JavaFX - TreeTableView sortPolicyProperty(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37697000/
我有一个TreeTableView,其中每个节点都有一个图标。当我伸展树(Splay Tree)时,一切正常,但是当我折叠树时,不再可见的项目的图标会被留下。 行和文本被删除,但图标仍然“自由 flo
我正在使用 TreeTableView 来显示树的内容。树中的排序顺序是手动的,我希望能够拖放项目。 如何在 TreeTableView 中拖放项目? 最佳答案 一种方法是使用“treeTableVi
我需要将树 TableView 的列中显示的值居中,如何将位置从左侧更改为中心? final TreeTableColumn dataColumn = new TreeTableColumn<>("D
我的问题是如何使用我自己的Comparator创建一个treetableview(JavaFX8)。 我找到了一些例子,例如 JavaFX TableView Sort Policy但它们都是Tabl
我想将图像添加到 TreeTableView 中的每个节点。为了做到这一点,我编写了以下内容(根据 Google 找到的一些页面): 调用更新 View Controller 中的 View publ
如何获取对 TreeTableView 中展开/折叠“箭头”的引用? 我无法提供任何代码,因为我真的不知道要寻找什么。 这是一张显示我需要的图片。突出显示的箭头是我需要的。 我想删除它,同时保留折叠/
我有以下 FXML:
我们努力实现以下目标: 当在 JavaFX TreeTableView 中选择一个节点时,还应该选择“根路径”,即父节点、祖父节点等。在这种情况下选择意味着用不同的背景颜色突出显示,请参见图像(在示例
我现在正在学习 JavaFX,但我似乎无法做对一件事。基本上我想做的是一个具有多重选择的 TreeTableView,在我尝试对列表进行排序之前它工作得很好。 代码如下(示例 15-1 来自 http
我想要实现的目标是或多或少拥有 Sale 对象,当它扩展为在该 Sale 对象下显示 SaleTransaction 对象时。类似于 Code Project 的图像中显示了想要的内容 除了读取之外,
thisColumn.setCellFactory(new Callback, TreeTableCell>() { @Override public TreeTableCell ca
我正在使用 JavaFX 中的 TreeTableView 类来实现分组股票行情观察列表。排序时,我只想对股票进行排序(而不是组)。目前,当我单击“符号”列(例如)时,它会对每个组中的股票进行排序(正
我注意到 TreeTableView 中有一个奇怪的 NPE 如果您在没有行的表格中双击,就会发生这种情况。我将附上屏幕截图以准确说明我的意思。 我纯粹来自 JavaFx 它与我的代码无关。我也做了一
我正在使用 TreeTableView ,我想根据所选行中的数据更改与上下文菜单关联的菜单项。 假设我有一个结构如下的表: 访客 访客1 访客2 访客 3 喋喋不休 喋喋不休1 喋喋不休2 在此表中,
我有一个 JFXTreeTableView,我想将每一列的数据文本居中。 有一个我创建列的代码: JFXTreeTableColumn DrinkColumn = new JFXTreeTableCo
我正在尝试设置 TreeTableView 的背景。 使用的 CSS 样式: .tree-table-cell, cell{ -fx-background-color: rgba(0, 0, 0
我一直在试验 JDK 8 中的 TreeTableView。在我的程序启动并运行后,我注意到一个问题,即当我滚动时,行会被清空。我已经尝试了一切,从重置单元格的可见性,更新时希望它在更新时重绘,甚至重
我想修改 TreeTableView 的点击行为,但老实说,我不确定这样做的预期方式应该是什么样子,或者是否需要更改它以任何方式。 大多数用户提示当前的行为不一致。有时单击一个单元格已经折叠/伸展树(
与 TreeTableView 一起工作时我意识到当您向下滚动表格并双击最后一个展开/折叠箭头时,所有项目都会消失。但是,当您再次滚动时,所有项目都会重新出现。当然,当你有足够的元素时会发生这种情况,
我在 FX、CSS 和 TreeTableView 方面遇到了一些问题。我有包含蓝色超链接的单元格。现在,如果选择该单元格,背景就会变成蓝色,因此该链接实际上是不可见的。我现在想使用样式表更改所选单元
我是一名优秀的程序员,十分优秀!