我有一個數據模型:
客戶端 - 名稱
在客戶端對象類中聲明的地圖。TreeTableView困境
客戶
-Title - 價值
-Title - 價值
-Title - 價值
客戶
-Title - 價值
-Title - 價值
-Title - 價值
據因爲我知道TreeTableView
必須只遵守一種數據類型有沒有一種方法,我可以讓它保持客戶端和Map
或我是否使Map
的一部分客戶端?
使用javatuples會起作用嗎?
public TreeTableView createContent() {
TreeItem<String> root = new TreeItem<>();
//treeTableView.setRoot(root);
root.setExpanded(true);
//final TreeItem<String> rootItem = new TreeItem<>();
ArrayList<TreeItem<String>> rootList = new ArrayList<TreeItem<String>>();
ArrayList<TreeItem<String>> titleList = new ArrayList<TreeItem<String>>();
ArrayList<TreeItem<String>> valueList = new ArrayList<TreeItem<String>>();
TreeItem<String> rootItem = new TreeItem<>();
for(Client client:clients){
rootItem = new TreeItem<>(client.getName());//.getName());
//rootItem.setValue(client.getName());//nameProperty().getValue());
rootList.add(rootItem);
}
for(Entry<Title, DoubleProperty> map1:map.entrySet()){
final TreeItem<Entry<Title, DoubleProperty>> mapItem = new TreeItem<>(map1);//.getKey(),map1.getValue());
final TreeItem<String> child2Item = new TreeItem<>(map1.getKey().getName());//, map1.getValue().getValue().toString());
final TreeItem<String> child3Item = new TreeItem<>(map1.getValue().getValue().toString());
titleList.add(child2Item);
valueList.add(child3Item);
}
/*for(Title title:titles){
//final TreeItem child1Item = new TreeItem<>(client.getValue(title));
final TreeItem<String> child2Item = new TreeItem<>(title.getName());//title.getName());
titleList.add(child2Item);
}*/
for(TreeItem<String> root1:rootList){
root.getChildren().add(root1);
for(TreeItem<String> title1:titleList){
root1.getChildren().add(title1);
}
for(TreeItem<String> value:valueList){
root1.getChildren().add(value);
}
}
// Name column
final TreeTableColumn<Client, String> nameColumn = new TreeTableColumn<>("Name");
nameColumn.setEditable(false);
nameColumn.setMinWidth(150);
//nameColumn.setCellValueFactory(new TreeItemPropertyValueFactory<Client, String>("value"));
nameColumn.setCellValueFactory(//param -> param.getValue().getValue().nameProperty());
new Callback<TreeTableColumn.CellDataFeatures<Client, String>, ObservableValue<String>>() {
@Override
public ObservableValue<String> call(TreeTableColumn.CellDataFeatures<Client, String> p) {
return new ReadOnlyObjectWrapper(p.getValue().getValue());
}
});
// Data column
TreeTableColumn<Client, String> dataColumn = new TreeTableColumn<>("Values");
dataColumn.setEditable(true);
dataColumn.setMinWidth(50);
// dataColumn.setCellValueFactory(new MapValueFactory<>("mapvalue");
//new TreeItemPropertyValueFactory<Client, String>("name"));
//dataColumn.setCellValueFactory(new TreeItemPropertyValueFactory<Client, String>("name"));
dataColumn.setCellValueFactory(
new Callback<TreeTableColumn.CellDataFeatures<Client, String>, ObservableValue<String>>() {
@Override
public ObservableValue<String> call(TreeTableColumn.CellDataFeatures<Client, String> p) {
return new ReadOnlyStringWrapper(p.getValue().getValue().getValues().values().toString());
}
});
final TreeTableView<Client> treeTableView = new TreeTableView(root);//rootItem);
treeTableView.setShowRoot(false);
treeTableView.getColumns().add(nameColumn);
treeTableView.getColumns().add(dataColumn);
treeTableView.setEditable(true);
treeTableView.setColumnResizePolicy(TreeTableView.CONSTRAINED_RESIZE_POLICY);
treeTableView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
treeTableView.setPrefSize(515, 100);
treeTableView.setLayoutX(10);
treeTableView.setLayoutY(10);
return treeTableView;
}
}
通過這樣做,我得到的值直屬每個標題不上的第二列,我覺得我欺騙自己使它成爲字符串我希望把它在未來可編輯,以便它改變實際地圖或客戶
客戶對象類中值:
public class Client {
private final StringProperty name = new SimpleStringProperty(this, "name");
public final String getName() {
return name.get();
}
public final void setName(String name) {
this.name.set(name);
}
public StringProperty nameProperty() {
return name ;
}
private final Map<Title, DoubleProperty> values = new HashMap<>();
public Client(String name) {
setName(name);
}
public DoubleProperty valueProperty(Title title) {
// In Java 8, just do
// return values.computeIfAbsent(title, t -> new SimpleDoubleProperty());
DoubleProperty value = values.get(title);
if (value == null) {
value = new SimpleDoubleProperty();
values.put(title, value);
}
return value ;
}
public final double getValue(Title title) {
return valueProperty(title).get();
}
public final void setValue(Title title, double value) {
valueProperty(title).set(value);
}
public Map<Title, DoubleProperty> getValues() {
return values ;
}
}
你想'Title'和'Value'添加到同一節點? – ItachiUchiha
不,我希望標題顯示爲孩子在客戶端父節點下,值在第二列lemme添加一些代碼來顯示我有什麼atm – izzypod5