Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带两列的TreeView JavaFX 8_Java_Javafx_Treeview_Javafx 8_Treetableview - Fatal编程技术网

带两列的TreeView JavaFX 8

带两列的TreeView JavaFX 8,java,javafx,treeview,javafx-8,treetableview,Java,Javafx,Treeview,Javafx 8,Treetableview,我需要在JavaFX8中有一个可扩展的可嵌套键值列表。这在功能上类似于树型视图,但它是垂直定向的,而不是水平定向的。换句话说,对于X-Y反转轴表格,行将是标题而不是列。由于TreeTableView水平的限制,我开始探索TreeView的选项TreeView工作得很好,但只有一列,每行中都需要一个键值对。我真正需要的是以下内容: 注意foo和bar可以是唯一的 如何向树状视图添加第二列?这是一个基于树状视图的自定义单元格工厂的想法,该工厂创建类似行的单元格。将创建一个自定义单元,该单元在网格中

我需要在JavaFX8中有一个可扩展的可嵌套键值列表。这在功能上类似于
树型视图
,但它是垂直定向的,而不是水平定向的。换句话说,对于X-Y反转轴表格,行将是标题而不是列。由于
TreeTableView
水平的限制,我开始探索
TreeView
的选项
TreeView
工作得很好,但只有一列,每行中都需要一个键值对。我真正需要的是以下内容:

注意
foo
bar
可以是唯一的


如何向
树状视图添加第二列?

这是一个基于树状视图的自定义单元格工厂的想法,该工厂创建类似行的单元格。将创建一个自定义单元,该单元在网格中包含2个标签和一些调整大小的行为设置

公共类CustomTree扩展应用程序{
@凌驾
public void start(Stage)引发异常{
TreeView tree=新的TreeView();
tree.setCellFactory(cell->new TreeCell(){
private GridPane=新建GridPane();
私有标签keyLabel=新标签();
私有标签valueLabel=新标签();
私有边框keyBorder=新边框(
新的BorderStroke(Color.BLACK,BorderStrokeStyle.SOLID,null,新的borderwidth(0.5,0.5,0.5,1));
私有边界值边界=新边界(
新边框笔划(Color.BLACK、BorderStrokeStyle.SOLID、null、新边框宽度(0.5、1、0.5、0.5));
{
pane.getChildren().addAll(keyLabel,valueLabel);
setConstraints(keyLabel,0,0);
setConstraints(valueLabel,1,0);
ColumnConstraints column1=新的ColumnConstraints();
列1.设置百分比宽度(50);
ColumnConstraints column2=新的ColumnConstraints();
第2列:设置百分比宽度(50);
pane.getColumnConstraints().addAll(column1,column2);
keyLabel.setOrder(keyBorder);
valueLabel.Setboorder(valueBorder);
keyLabel.setMaxWidth(双倍最大值);
valueLabel.setMaxWidth(双重最大值);
设置填充(插图为空);
}
@凌驾
public void updateItem(字符串[]名称,布尔空){
super.updateItem(名称,空);
if(空| | name==null){
setText(空);
设置图形(空);
}否则{
keyLabel.setText(名称[0]);
valueLabel.setText(名称[1]);
设置图形(窗格);
}
}
});
TreeItem root=new TreeItem(新字符串[]{“”“”});
TreeItem sub1=新的TreeItem(新字符串[]{“Foo”,“Bar”});
TreeItem sub2=新的TreeItem(新字符串[]{“Foo”,“Bar”});
TreeItem sub3=新的TreeItem(新字符串[]{“Foo”,“Bar”});
TreeItem sub4=新的TreeItem(新字符串[]{“Foo”,“”});
TreeItem sub5=新的TreeItem(新字符串[]{“Foo”,“Bar”});
TreeItem sub41=新的TreeItem(新字符串[]{“Foo”,“Bar”});
TreeItem sub42=新的TreeItem(新字符串[]{“Foo”,“Bar”});
root.getChildren().addAll(sub1、sub2、sub3、sub4、sub5);
sub4.getChildren().addAll(sub41,sub42);
树根;
场景=新场景(树);
舞台场景;
stage.show();
}
公共静态void main(字符串[]args){
应用程序启动(args);
}
}
请注意,根也必须使用此单元格类型,尽管可以使用
tree.setShowRoot(false)完全隐藏根。这种方法的两个缺点是,每个单元格都作为一个单元运行—没有列的概念,并且单元格的值作为数组给出,因此失去了类型安全性。您可以自己扩展这个示例


使用(通用的)
TableView
TreeTableView
方法是可能的,尽管需要做更多的工作。

这是一个基于自定义单元格工厂的想法,用于创建类似行的单元格。将创建一个自定义单元,该单元在网格中包含2个标签和一些调整大小的行为设置

公共类CustomTree扩展应用程序{
@凌驾
public void start(Stage)引发异常{
TreeView tree=新的TreeView();
tree.setCellFactory(cell->new TreeCell(){
private GridPane=新建GridPane();
私有标签keyLabel=新标签();
私有标签valueLabel=新标签();
私有边框keyBorder=新边框(
新的BorderStroke(Color.BLACK,BorderStrokeStyle.SOLID,null,新的borderwidth(0.5,0.5,0.5,1));
私有边界值边界=新边界(
新边框笔划(Color.BLACK、BorderStrokeStyle.SOLID、null、新边框宽度(0.5、1、0.5、0.5));
{
pane.getChildren().addAll(keyLabel,valueLabel);
setConstraints(keyLabel,0,0);
setConstraints(valueLabel,1,0);
ColumnConstraints column1=新的ColumnConstraints();
列1.设置百分比宽度(50);
ColumnConstraints column2=新的ColumnConstraints();
第2列:设置百分比宽度(50);
pane.getColumnConstraints().addAll(column1,column2);
keyLabel.setOrder(keyBorder);
valueLabel.Setboorder(valueBorder);
keyLabel.setMaxWidth(双倍最大值);
valueLabel.setMaxWidth(双重最大值);
设置填充(插图为空);
}
@凌驾
P
public class CustomTree extends Application {

    @Override
    public void start(Stage stage) throws Exception {
        TreeView<String[]> tree = new TreeView<>();

        tree.setCellFactory(cell -> new TreeCell<String[]>() {

            private GridPane pane = new GridPane();
            private Label keyLabel = new Label();
            private Label valueLabel = new Label();
            private Border keyBorder = new Border(
                    new BorderStroke(Color.BLACK, BorderStrokeStyle.SOLID, null, new BorderWidths(0.5, 0.5, 0.5, 1)));
            private Border valueBorder = new Border(
                    new BorderStroke(Color.BLACK, BorderStrokeStyle.SOLID, null, new BorderWidths(0.5, 1, 0.5, 0.5)));

            {
                pane.getChildren().addAll(keyLabel, valueLabel);
                GridPane.setConstraints(keyLabel, 0, 0);
                GridPane.setConstraints(valueLabel, 1, 0);

                ColumnConstraints column1 = new ColumnConstraints();
                column1.setPercentWidth(50);
                ColumnConstraints column2 = new ColumnConstraints();
                column2.setPercentWidth(50);
                pane.getColumnConstraints().addAll(column1, column2);

                keyLabel.setBorder(keyBorder);
                valueLabel.setBorder(valueBorder);
                keyLabel.setMaxWidth(Double.MAX_VALUE);
                valueLabel.setMaxWidth(Double.MAX_VALUE);

                setPadding(Insets.EMPTY);
            }

            @Override
            public void updateItem(String[] name, boolean empty) {
                super.updateItem(name, empty);
                if (empty || name == null) {
                    setText(null);
                    setGraphic(null);
                } else {
                    keyLabel.setText(name[0]);
                    valueLabel.setText(name[1]);
                    setGraphic(pane);
                }
            }
        });

        TreeItem<String[]> root = new TreeItem<>(new String[] { "", "" });
        TreeItem<String[]> sub1 = new TreeItem<>(new String[] { "Foo", "Bar" });
        TreeItem<String[]> sub2 = new TreeItem<>(new String[] { "Foo", "Bar" });
        TreeItem<String[]> sub3 = new TreeItem<>(new String[] { "Foo", "Bar" });
        TreeItem<String[]> sub4 = new TreeItem<>(new String[] { "Foo", "" });
        TreeItem<String[]> sub5 = new TreeItem<>(new String[] { "Foo", "Bar" });
        TreeItem<String[]> sub41 = new TreeItem<>(new String[] { "Foo", "Bar" });
        TreeItem<String[]> sub42 = new TreeItem<>(new String[] { "Foo", "Bar" });
        root.getChildren().addAll(sub1, sub2, sub3, sub4, sub5);
        sub4.getChildren().addAll(sub41, sub42);

        tree.setRoot(root);

        Scene scene = new Scene(tree);
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        Application.launch(args);
    }
}