使用Java为一棵极大的树创建图表

olmpazwi  于 2022-12-02  发布在  Java
关注(0)|答案(1)|浏览(105)

问题很简单。我想创建一个垂直的值树,当你向下移动时,值的数量会以指数级增加。假设第一层有1个数值,下一层有10个,然后下一层有100个,再下一层有1000个,依此类推。第一层和第二层用线连接。第二个值到第三个值,以此类推,就像游戏树一样。这些值也是均匀分布的,假设您有一个500x500的JPanel。y为100时,您有4个值,因此为了均匀分布它们,您将有一个值为100,一个值为200,以此类推。
我尝试过合并drawString,用drawLine方法连接它们,并将这个所谓的图放在JPanel上。这实际上非常简单,如果在单个级别中只有50个~值,它就可以工作。但是,如果只有1600x900的屏幕,就无法容纳100个值(在x轴上,也就是1600)而不会有一个大的混乱。
我在想有两种可能的解决方案。
一个是JPanel不局限于一个设定的分辨率(也就是你的屏幕大小),并且是可滚动的。如果它是10000 x 900,那么制作这个巨大的树形图实际上会很简单,我可以很容易地在100个值之间留出足够的空间,使这些值实际上是可识别的。但是,据我所知,这是不可能的。
第二个解决方案是我将这些值写入一个文件,但我不知道如何进行。
有没有人知道,从理论上讲,正确显示一个大型树形图的最简单的解决方案是什么?

e0bqpujr

e0bqpujr1#

Oracle有一个很有用的教程Creating a GUI With Swing。跳过使用NetBeans IDE学习Swing部分。特别注意Performing Custom Painting部分。
事实证明,可以创建一个10000 x 900的JPanel绘图。将JScrollPane首选大小调整为您想要显示的大小。高度至少应为950像素,以便为水平滚动条留出空间。
我创建了一个棋盘图案,这样您就可以看到JPanel图形确实在滚动。

下面是完整的可运行代码。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;

public class LargeDrawingJPanel implements Runnable {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new LargeDrawingJPanel());
    }

    @Override
    public void run() {
        JFrame frame = new JFrame("Large Drawing JPanel");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel drawingPanel = new DrawingPanel();
        JScrollPane scrollPane = new JScrollPane(drawingPanel);
        scrollPane.setPreferredSize(new Dimension(1400, 950));
        frame.add(scrollPane, BorderLayout.CENTER);

        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public class DrawingPanel extends JPanel {

        private static final long serialVersionUID = 1L;

        public DrawingPanel() {
            this.setPreferredSize(new Dimension(10000, 900));
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);

            Graphics2D g2d = (Graphics2D) g;
            Color[] colors = { Color.RED, Color.BLACK };
            int colorIndex = 0;
            int x = 0;
            int y = 0;
            for (int i = 0; i < 100; i++) {
                for (int j = 0; j < 9; j++) {
                    g2d.setColor(colors[colorIndex]);
                    colorIndex = (colorIndex == 0) ? 1 : 0;
                    g2d.fillRect(x, y, 100, 100);
                    y += 100;
                }
                x += 100;
                y = 0;
            }
        }

    }

}

相关问题