javafx TreeTableView 字符串数组列
javafx TreeTableView string array columns
所有现有答案都使用 class 对象来显示多列。我必须使用 class 吗?我可以只使用像 C# 的 ListViewItem 这样的字符串数组吗?如果可以,怎么做?
例如,第一列显示“hello”,第二列显示“world”。
public class HelloController {
@FXML
private TreeTableView mytree;
@FXML
private TreeTableColumn colFirst;
@FXML
private TreeTableColumn colSecond;
@FXML
void initialize()
{
TreeItem<String[]> item = new TreeItem<String[]>(new String[]{"hello", "world"});
colFirst.setCellValueFactory((CellDataFeatures<Object, String[]> p)
-> new ReadOnlyStringWrapper(p.getValue().toString()));
mytree.setRoot(item);
}
}
fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<VBox alignment="CENTER" spacing="20.0" xmlns="http://javafx.com/javafx/17" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.example.fx2.HelloController">
<TreeTableView fx:id="mytree" prefHeight="200.0" prefWidth="200.0">
<columns>
<TreeTableColumn id="colFirst" prefWidth="75.0" text="First" />
<TreeTableColumn id="colSecond" prefWidth="75.0" text="Second" />
</columns>
</TreeTableView>
</VBox>
切勿使用原始类型:正确参数化您的类型:
public class HelloController {
@FXML
private TreeTableView<String[]> mytree;
@FXML
private TreeTableColumn<String[], String> colFirst;
@FXML
private TreeTableColumn<String[], String> colSecond;
// ...
}
那么在lambda表达式中,p
是一个TreeTableColumn.CellDataFeatures<String[], String>
,所以p.getValue()
是一个TreeItem<String[]>
,p.getValue().getValue()
是String[]
代表行。
所以你可以做到
@FXML
void initialize() {
TreeItem<String[]> item = new TreeItem<String[]>(new String[]{"hello", "world"});
colFirst.setCellValueFactory(p
-> new ReadOnlyStringWrapper(p.getValue().getValue()[0]));
mytree.setRoot(item);
}
所有现有答案都使用 class 对象来显示多列。我必须使用 class 吗?我可以只使用像 C# 的 ListViewItem 这样的字符串数组吗?如果可以,怎么做?
例如,第一列显示“hello”,第二列显示“world”。
public class HelloController {
@FXML
private TreeTableView mytree;
@FXML
private TreeTableColumn colFirst;
@FXML
private TreeTableColumn colSecond;
@FXML
void initialize()
{
TreeItem<String[]> item = new TreeItem<String[]>(new String[]{"hello", "world"});
colFirst.setCellValueFactory((CellDataFeatures<Object, String[]> p)
-> new ReadOnlyStringWrapper(p.getValue().toString()));
mytree.setRoot(item);
}
}
fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<VBox alignment="CENTER" spacing="20.0" xmlns="http://javafx.com/javafx/17" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.example.fx2.HelloController">
<TreeTableView fx:id="mytree" prefHeight="200.0" prefWidth="200.0">
<columns>
<TreeTableColumn id="colFirst" prefWidth="75.0" text="First" />
<TreeTableColumn id="colSecond" prefWidth="75.0" text="Second" />
</columns>
</TreeTableView>
</VBox>
切勿使用原始类型:正确参数化您的类型:
public class HelloController {
@FXML
private TreeTableView<String[]> mytree;
@FXML
private TreeTableColumn<String[], String> colFirst;
@FXML
private TreeTableColumn<String[], String> colSecond;
// ...
}
那么在lambda表达式中,p
是一个TreeTableColumn.CellDataFeatures<String[], String>
,所以p.getValue()
是一个TreeItem<String[]>
,p.getValue().getValue()
是String[]
代表行。
所以你可以做到
@FXML
void initialize() {
TreeItem<String[]> item = new TreeItem<String[]>(new String[]{"hello", "world"});
colFirst.setCellValueFactory(p
-> new ReadOnlyStringWrapper(p.getValue().getValue()[0]));
mytree.setRoot(item);
}