繁体   English   中英

JAVA:对正确的for循环迭代感到困惑吗?

[英]JAVA: Confusion with correct for-loop iteration?

背景资料:

我正在编写一个程序,该程序应该在其中绘制数据集的图形,该数据集使用DrawingPanel类存储在以下文件( 输入文件 )中,称为“ names.txt”。

该Java文件允许您创建给定尺寸的面板,并在该面板中绘制形状和线条。 我的程序遇到的问题与类方法的规范和理解无关。

我应该使用以下java文件绘制的数据集是通过以下方式配置的:

[名称] [性别] [排名] [排名] [排名] [排名] .... etc,共14个排名。

例:

简F 98108128116 48 55 47 39 67202312345436384384

程序的总体目标:用户应该输入他们希望看到的姓名和性别。 然后将数据绘制成图表,等级代表y轴,时间代表x轴。

我的主要问题是绘制构成图形的线。 这些图的线使用以下方法绘制:

g.drawLine(x1, y1, x2, y2)

其中g代表Graphics对象。 需要两个点,因为创建线需要两个端点。

此for循环负责打印行。

    for (int j = 0; j < SECTION_WIDTH * DECADES; j += SECTION_WIDTH){
            g.setColor(Color.BLACK);
            g.drawLine(j, yCoordinate, i + intervalIncrease, yCoordinate2);
            g.setColor(Color.RED);
            intervalIncrease += SECTION_WIDTH;
            g.drawString(intervalLabel, intervalIncrease , yCoordinate);
            }            
    }

问题摘要:上面的for循环是我程序中错误的原因。 问题是组成图形的线的打印不正确。 这是由于不正确的for循环迭代和条件引起的,而这些又由于for循环的尴尬位置以及必须正确调用程序而必须两次调用所有函数这一事实而变得复杂。 尽管经过了数小时的猜测和检查,我仍无法弄清楚如何操纵循环以使其正常工作。

这很复杂,因为drawString方法依赖于drawLine方法变量。

我尝试将其实现到我的代码中,但没有成功。

有关DrawingPanel.java的特定要求和其他信息:

请参阅此( 规范 )以获取有关图形外观和其他要求的规范。

下面还提供了图形外观的图像。

    public static void drawRanks(String line, Graphics g){
    int yearIncrease = 0;
    int intervalIncrease = 0;
    System.out.println(line);
    Scanner lineScan = new Scanner(line);
    String name = lineScan.next();
    String gender = lineScan.next();
    for(int i = 0; i < DECADES/2; i++) {
        g.setColor(Color.RED);
        int rank = lineScan.nextInt();
        int rank2 = lineScan.nextInt();
        int yCoordinate = rank/2 + 25;
        int yCoordinate2 = rank2/2 + 25;
        String intervalLabel = name + " " + gender + " " + String.valueOf(rank);
        String intervalLabel2 = name + " " + gender + " " + String.valueOf(rank2);
        if (rank == 0){
            yCoordinate = 525;
        }
        if (rank2 == 0){
            yCoordinate2 = 525;
        }
        for (int j = 0; j < SECTION_WIDTH * DECADES; j += SECTION_WIDTH){
            g.setColor(Color.BLACK);
            g.drawLine(j, yCoordinate, i + intervalIncrease, yCoordinate2);
            g.setColor(Color.RED);
            intervalIncrease += SECTION_WIDTH;
            g.drawString(intervalLabel, intervalIncrease , yCoordinate);
            }            
    }

    for(int j = 0; j < DECADES; j++) {
        g.setColor(Color.BLACK);
        g.drawString(String.valueOf(STARTING_YEAR + yearIncrease), SECTION_WIDTH * j, 550);
        yearIncrease += 10;
    }  

    for (int k = DECADES * SECTION_WIDTH; k >= 0; k -= SECTION_WIDTH){
        g.drawLine(k, 0, k, 550);
    }

}

产生的图形图像: DrawingPanel图形

预期图形: 预期的DrawingPanel图形

如果我的解释不清楚,请随时发表评论。 如果需要,这里是DrawingPanel类的位置,出于编译目的。 DrawingPanel.java

这是方法的API:

DrawingPanel name = new DrawingPanel(width, height);

Graphics g - name.getGraphics();

panel.setBackground(color); -  sets panel's background color

g.setColor(color); - sets Graphics pen color (like dipping a brush in paint)

g.drawLine(x1, y2, x2, y2); - a line from points (x1, y1) to (x2, y2)

g.drawString(text, x, y); - the given text with its lower-left corner at (x, y)

您必须成对读取等级的一般想法是错误的。 您要做的是从最后一个等级的坐标到当前等级的坐标画一条线。 这是我的方法版本(请注意,我没有您的整个环境,因此我无法进行实际测试):

public static void drawRanks(String line, Graphics g){
    int yearIncrease = 0;
    System.out.println(line);
    Scanner lineScan = new Scanner(line);
    String name = lineScan.next();
    String gender = lineScan.next();
    int lastRank = lineScan.nextInt();
    int lastY = lastRank/2 + 25;
    if ( lastRank == 0 ) {
        lastY = 525;
    }
    int lastX = 0;

    while ( lineScan.hasNextInt() ) {
        int rank = lineScan.nextInt();

        int y = rank/2 + 25;
        if (rank == 0){
            y = 525;
        }
        int x = lastX + SECTION_WIDTH;

        String intervalLabel = name + " " + gender + " " + String.valueOf(lastRank);

        g.setColor(Color.RED);
        g.drawLine(lastX, lastY, x, y);
        g.drawString(intervalLabel,lastX,lastY);
        lastX = x;
        lastY = y;
        lastRank = rank;

    }

    g.drawString(intervalLabel,lastX,lastY);

    for(int j = 0; j < DECADES; j++) {
        g.setColor(Color.BLACK);
        g.drawString(String.valueOf(STARTING_YEAR + yearIncrease), SECTION_WIDTH * j, 550);
        yearIncrease += 10;
    }  

    for (int k = DECADES * SECTION_WIDTH; k >= 0; k -= SECTION_WIDTH){
        g.drawLine(k, 0, k, 550);
    }

}

因此,首先阅读名称和性别,然后阅读第一个等级,以得到初始坐标。

然后,在循环的每次迭代中,您仅读取一个等级。 您从先前的等级到新的等级画了一条线。 您在前一等级的坐标处绘制属于前一等级的标签。 然后将当前的xyrank分别保存到lastXlastYlastRank ,以便可以在下一次迭代中使用它们。

循环完成后,您仍然有一个未绘制的标签,因此可以绘制它,然后继续绘制黑线(我没有在这里查看代码的正确性,只是照原样保留了它) )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM