Java Swing中的树状图


在本教程中,我们将使用MindFusion图形库(用于Java)并使用IntelliJ作为开发IDE来构建TreeMap图。

I.使用Gradle和Maven进行常规设置

我们创建一个新的Gradle项目,命名为TreemapDiagram。我们创建一个名为com.mindfusion.tutorial的新包。然后,我们从IntelliJ工具栏中打开File->'Project Structure'菜单,然后单击菜单树中的'Libraries'项目。然后我们单击加号“ +”,然后从项目子菜单中选择“ Maven”。在打开的对话框中,我们在搜索框中输入“ mindfusion”。您应该在Maven上看到可用的MindFusion Java存储库。我们选择图。

1.png

之后,转到“模块”选项卡,选择项目名称,然后使用“ +”号再次添加库。从下拉菜单列表中,在要添加的模块类型上选择“库”。然后,从Maven库中选择新添加的内容,然后单击“应用”。这样,新库将添加到项目的类路径中,并且IntelliJ可以识别它。单击“确定”,然后关闭窗口。

2021-02-01-134118-1920x1080-scrot.png

我们通过右键单击src文件夹中的主子文件夹来添加新软件包。然后,在包中,再次单击鼠标右键,我们添加一个称为MainWidow的新类。MainWindow扩展了JFrame,它将成为我们应用程序中的主要类和唯一类。我们在其中添加main方法,然后在其中创建MainWindow并将其呈现在屏幕上。

public static void main(String[] args) {
    SwingUtilities.invokeLater(() -> {
        MainWindow window = new MainWindow();
    window.setVisible(true);
});

在构造函数中,我们在创建新的MainWindow时添加标准代码:

private MainWindow() {
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    setSize(new Dimension(1200, 800));
    setTitle("Delivery service");
}

我们设置默认的关闭操作,窗口大小和标题。我们还声明了一个类变量,称为Diagram类型。我们将图初始化为构造函数中Diagram类的新实例。我们还在新创建的图上指定一些设置:

java

20210222161755.png

我们为图表指定默认形状:矩形。我们还将后刷设置为白色,将度量单位设置为毫米,并指定图的初始边界。

然后,我们添加一个DiagramView实例,它是呈现图的控件。图对象不会直接呈现自己。DiagramView是在2D空间中绘制图的方法之一。我们将diagramView放在JScrollPane中,这将允许在较小的窗口中滚动较大的图。最后,我们将JScrollPane添加到JFrame的contentPane中:

20210222161726.png

现在,我们将XML文件添加到项目中,就在MainWindow.java文件所在的位置。XML文件包含我们图的数据。这是快递公司的统计数据。我们正在构建的树状图将显示加利福尼亚州快递公司的覆盖范围:

XML格式

<?xml version="1.0" encoding="utf-8" ?>

二。解析数据并创建图元素

我们借助javax.xml.parsers命名空间中的DocumentBuilderFactory和DocumentBuilder类来解析XML文件。我们还使用org.w3c.dom中的Document类和java.io中的File。 我们将代码放在一个名为assignData的新方法中:

20210222161558.png

然后我们需要从解析的文件中获取DocumentElement,然后获取包含定义为的节点的列表:

20210222161525.png

stateNodes变量再次定义为类变量。它是NodeList类型。我们得到NodeList中第一个标记为“cities”的元素,它是唯一的元素。然后,在另一个NodeList中,我们得到标记为“city”的所有元素。完成此操作后,我们将创建一个ContainerNode并设置其标题:

20210222161443.png

我们循环浏览第二个列表中的所有元素,包括员工和城市:

20210222161032.png

我们使用图表库的工厂类。它是一个帮助类,用于创建各种类型的DiagramItem-s。您不创建工厂对象,而是使用Diagram的getFactory方法创建一个工厂对象。通过FactoryClass的createShapeNode方法,我们创建了表示城市XML数据的所有ShapeNode。我们将它们添加到容器节点。 这里我们需要注意的是,setTag方法用于将元素及其数据添加到每个ShapeNode中。当我们构建布局时,我们保留它以供进一步参考。DiagramItem的Tag属性正好用于这样的情况:当您要存储与对象相关的数据时。

三、 图表布局和着色

为了使TreemapLayout工作,我们需要为ShapeNode-s分配权重。这些权重被几种布局算法使用,treemap就是其中之一。权重也可以指定给链接。 我们从对应于这个ShapeNode的XML元素中获得coverage属性的值,并将其乘以1000。这使得该值适用于布局算法。然后使用setWeight将计算出的权重分配给节点。

20210222160933.png Java

我们现在宣布一个带有我们将用于地图的颜色的数组:

Private Color[] scale;

我们将数组定义为类变量,并初始化构造函数中的颜色:

20210222160614.png

阵列中的颜色可以大于或小于3。您拥有的颜色越多,颜色映射将越准确。然后我们编写另一个方法,称为assignColors。在其中,我们将根据其权重为​​其节点设置正确的笔刷阴影。

20210222160350.png

我们计算最大覆盖率,并根据节点与最大数量的比率计算节点的阴影:

20210222160235.png

我们需要实现的最后一种方法是图的布局。这是我们创建TreemapLayout算法实例并将其应用于图的方法:

20210222160157.png

所有布局算法都以相同的方式应用:您创建布局类的实例,通过其属性自定义布局,然后使用应在其上应用算法的图调用其layout方法。

我们需要调用在MainWindow构造函数中创建的方法:

assignData();
assignWeights();
assignColors)();
createLayout();

并且我们的TreeMap应用程序已准备就绪。

java-treemap.png


原文链接:http://codingdict.com