Swing 如何在树表中绘制时间线

Swing 如何在树表中绘制时间线,swing,user-interface,javafx,Swing,User Interface,Javafx,我正在编写一个分析器,以直观地查看我的应用程序在哪里花费时间。我试图实现的界面(见下文)类似于具有 表示响应时间的行或框 是一个可折叠的树状图 在表列中显示指标的能力(例如,开始时间、成本等) 在左侧和右侧分别显示标签、描述和指标的功能 我在R中创建了下图(见下文)——不幸的是,尽管图形生成是自动化的,但这种方法不是交互式的。我想知道你能不能建议一个更好的方法--也许是一张树桌。我看了很多Swing、JavaFx树表示例。我没有看到树表中有行(时间线)的示例 如有任何建议,将不胜感激。提前

我正在编写一个分析器,以直观地查看我的应用程序在哪里花费时间。我试图实现的界面(见下文)类似于具有

  • 表示响应时间的行或框
  • 是一个可折叠的树状图
  • 在表列中显示指标的能力(例如,开始时间、成本等)
  • 在左侧和右侧分别显示标签、描述和指标的功能
我在R中创建了下图(见下文)——不幸的是,尽管图形生成是自动化的,但这种方法不是交互式的。我想知道你能不能建议一个更好的方法--也许是一张树桌。我看了很多Swing、JavaFx树表示例。我没有看到树表中有行(时间线)的示例


如有任何建议,将不胜感激。提前谢谢

您可以使用javaFX中的
grahic
属性显示
TreeTableCell
中的任何节点。这包括
矩形
s

这是一个使用
矩形显示列中条形图的简单示例:

// Arrays in TreeItems contain {startValue, endValue} (both positive)
TreeItem<int[]> root = new TreeItem<>(new int[]{0, 10});
root.getChildren().addAll(new TreeItem<>(new int[]{0, 5}), new TreeItem<>(new int[]{5, 10}));
TreeTableView<int[]> ttv = new TreeTableView<>(root);

// Column displaying bars based on data of TreeItem. Do not use this as
// the first column, otherwise the alignment be off depending on the
// distance to the root.
TreeTableColumn<int[], int[]> column = new TreeTableColumn<>();
column.setCellValueFactory(c -> c.getValue().valueProperty());

final double BAR_SIZE = 20;
column.setCellFactory((t) -> new TreeTableCell<int[], int[]>() {

    // the bar
    private final Rectangle rectangle = new Rectangle(0, 10);

    {
        setContentDisplay(ContentDisplay.GRAPHIC_ONLY);

        // bar invisible by default
        rectangle.setVisible(false);
        setGraphic(rectangle);
    }

    @Override
    protected void updateItem(int[] item, boolean empty) {
        super.updateItem(item, empty);
        if (!empty && item != null) {
            // resize and display bar, it item is present
            rectangle.setWidth((item[1] - item[0]) * BAR_SIZE);
            rectangle.setTranslateX(item[0] * BAR_SIZE);
            rectangle.setVisible(true);
        } else {
            // no item -> hide bar
            rectangle.setVisible(false);
        }
    }
});

// add a columns new column
// add a additional empty column at the start to prevent bars being
// aligned based on distance to the root
ttv.getColumns().addAll(new TreeTableColumn<>(), column);
//树元素中的数组包含{startValue,endValue}(均为正数)
TreeItem root=newtreeitem(newint[]{0,10});
addAll(新的TreeItem(新的int[]{0,5}),新的TreeItem(新的int[]{5,10}));
TreeTableView ttv=新的TreeTableView(根目录);
//基于TreeItem数据显示栏的列。不要将此用作
//第一列,否则将根据
//到根部的距离。
TreeTableColumn=新的TreeTableColumn();
column.setCellValueFactory(c->c.getValue().valueProperty());
最终双钢筋尺寸=20;
column.setCellFactory((t)->新的TreeTableCell(){
//酒吧
私有最终矩形=新矩形(0,10);
{
setContentDisplay(仅限ContentDisplay.GRAPHIC_);
//默认情况下,条不可见
矩形。setVisible(false);
设置图形(矩形);
}
@凌驾
受保护的void updateItem(int[]项,布尔空){
super.updateItem(项,空);
如果(!empty&&item!=null){
//调整和显示栏的大小,显示项目
矩形.setWidth((项目[1]-项目[0])*BAR_尺寸);
矩形.setTranslateX(项目[0]*条尺寸);
矩形。setVisible(true);
}否则{
//无项目->隐藏栏
矩形。setVisible(false);
}
}
});
//添加一列新列
//在开始处添加一个额外的空列,以防止出现条
//基于到根部的距离对齐
ttv.getColumns().addAll(新的TreeTableColumn(),column);
你需要做的事情
  • 使用与
    int[]
    不同的数据类型;单元格值工厂和
    TreeTableCell
    需要相应调整;可以在oracle教程中找到更复杂模型的示例:
  • 选择更好的颜色;例如,这些颜色可以存储在
    地图中
    ,并在需要新颜色时创建
  • 添加额外的柱

您可能想看看第三方(以及商业许可的第三方)。谢谢-让我检查一下谢谢。今天让我试试。我会让你知道这是否有效。